mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 14:02:06 -04:00
net: Revert "net: optimize the sockptr_t for unified kernel/user address spaces"
This reverts commits6d04fe15f7anda31edb2059. It turns out the idea to share a single pointer for both kernel and user space address causes various kinds of problems. So use the slightly less optimal version that uses an extra bit, but which is guaranteed to be safe everywhere. Fixes:6d04fe15f7("net: optimize the sockptr_t for unified kernel/user address spaces") Reported-by: Eric Dumazet <edumazet@google.com> Reported-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
7c7ab580db
commit
519a8a6cf9
@@ -8,26 +8,9 @@
|
||||
#ifndef _LINUX_SOCKPTR_H
|
||||
#define _LINUX_SOCKPTR_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
|
||||
typedef union {
|
||||
void *kernel;
|
||||
void __user *user;
|
||||
} sockptr_t;
|
||||
|
||||
static inline bool sockptr_is_kernel(sockptr_t sockptr)
|
||||
{
|
||||
return (unsigned long)sockptr.kernel >= TASK_SIZE;
|
||||
}
|
||||
|
||||
static inline sockptr_t KERNEL_SOCKPTR(void *p)
|
||||
{
|
||||
return (sockptr_t) { .kernel = p };
|
||||
}
|
||||
#else /* CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE */
|
||||
typedef struct {
|
||||
union {
|
||||
void *kernel;
|
||||
@@ -45,15 +28,10 @@ static inline sockptr_t KERNEL_SOCKPTR(void *p)
|
||||
{
|
||||
return (sockptr_t) { .kernel = p, .is_kernel = true };
|
||||
}
|
||||
#endif /* CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE */
|
||||
|
||||
static inline int __must_check init_user_sockptr(sockptr_t *sp, void __user *p,
|
||||
size_t size)
|
||||
static inline sockptr_t USER_SOCKPTR(void __user *p)
|
||||
{
|
||||
if (!access_ok(p, size))
|
||||
return -EFAULT;
|
||||
*sp = (sockptr_t) { .user = p };
|
||||
return 0;
|
||||
return (sockptr_t) { .user = p };
|
||||
}
|
||||
|
||||
static inline bool sockptr_is_null(sockptr_t sockptr)
|
||||
|
||||
Reference in New Issue
Block a user