mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 15:36:55 +08:00
powerpc/uaccess: Refactor user_{read/write/}_access_begin()
user_read_access_begin() and user_write_access_begin() and
user_access_begin() are now very similar. Create a common
__user_access_begin() that takes direction as parameter.
In order to avoid a warning with the conditional call of
barrier_nospec() which is sometimes an empty macro, change it to a
do {} while (0).
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/2b4f9d4e521e0b56bf5cb239916b4a178c4d2007.1766574657.git.chleroy@kernel.org
This commit is contained in:
committed by
Madhavan Srinivasan
parent
5458989a0e
commit
704f430031
@@ -102,7 +102,7 @@ do { \
|
||||
|
||||
#else /* !CONFIG_PPC_BARRIER_NOSPEC */
|
||||
#define barrier_nospec_asm
|
||||
#define barrier_nospec()
|
||||
#define barrier_nospec() do {} while (0)
|
||||
#endif /* CONFIG_PPC_BARRIER_NOSPEC */
|
||||
|
||||
/*
|
||||
|
||||
@@ -410,51 +410,31 @@ copy_mc_to_user(void __user *to, const void *from, unsigned long n)
|
||||
extern long __copy_from_user_flushcache(void *dst, const void __user *src,
|
||||
unsigned size);
|
||||
|
||||
static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
|
||||
static __must_check __always_inline bool __user_access_begin(const void __user *ptr, size_t len,
|
||||
unsigned long dir)
|
||||
{
|
||||
if (unlikely(!access_ok(ptr, len)))
|
||||
return false;
|
||||
|
||||
might_fault();
|
||||
|
||||
barrier_nospec();
|
||||
allow_read_write_user((void __user *)ptr, ptr, len);
|
||||
if (dir & KUAP_READ)
|
||||
barrier_nospec();
|
||||
allow_user_access((void __user *)ptr, dir);
|
||||
return true;
|
||||
}
|
||||
#define user_access_begin user_access_begin
|
||||
#define user_access_end prevent_current_access_user
|
||||
|
||||
#define user_access_begin(p, l) __user_access_begin(p, l, KUAP_READ_WRITE)
|
||||
#define user_read_access_begin(p, l) __user_access_begin(p, l, KUAP_READ)
|
||||
#define user_write_access_begin(p, l) __user_access_begin(p, l, KUAP_WRITE)
|
||||
|
||||
#define user_access_end() prevent_user_access(KUAP_READ_WRITE)
|
||||
#define user_read_access_end() prevent_user_access(KUAP_READ)
|
||||
#define user_write_access_end() prevent_user_access(KUAP_WRITE)
|
||||
|
||||
#define user_access_save prevent_user_access_return
|
||||
#define user_access_restore restore_user_access
|
||||
|
||||
static __must_check __always_inline bool
|
||||
user_read_access_begin(const void __user *ptr, size_t len)
|
||||
{
|
||||
if (unlikely(!access_ok(ptr, len)))
|
||||
return false;
|
||||
|
||||
might_fault();
|
||||
|
||||
barrier_nospec();
|
||||
allow_read_from_user(ptr, len);
|
||||
return true;
|
||||
}
|
||||
#define user_read_access_begin user_read_access_begin
|
||||
#define user_read_access_end prevent_current_read_from_user
|
||||
|
||||
static __must_check __always_inline bool
|
||||
user_write_access_begin(const void __user *ptr, size_t len)
|
||||
{
|
||||
if (unlikely(!access_ok(ptr, len)))
|
||||
return false;
|
||||
|
||||
might_fault();
|
||||
|
||||
allow_write_to_user((void __user *)ptr, len);
|
||||
return true;
|
||||
}
|
||||
#define user_write_access_begin user_write_access_begin
|
||||
#define user_write_access_end prevent_current_write_to_user
|
||||
|
||||
#define arch_unsafe_get_user(x, p, e) do { \
|
||||
__long_type(*(p)) __gu_val; \
|
||||
__typeof__(*(p)) __user *__gu_addr = (p); \
|
||||
|
||||
Reference in New Issue
Block a user