uaccess: Selectively open read or write user access
When opening user access to only perform reads, only open read access. When opening user access to only perform writes, only open write access. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/2e73bc57125c2c6ab12a587586a4eed3a47105fc.1585898438.git.christophe.leroy@c-s.fr
This commit is contained in:

committed by
Michael Ellerman

parent
999a22890c
commit
41cd780524
@@ -1557,7 +1557,7 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
||||
if (!infop)
|
||||
return err;
|
||||
|
||||
if (!user_access_begin(infop, sizeof(*infop)))
|
||||
if (!user_write_access_begin(infop, sizeof(*infop)))
|
||||
return -EFAULT;
|
||||
|
||||
unsafe_put_user(signo, &infop->si_signo, Efault);
|
||||
@@ -1566,10 +1566,10 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
||||
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
||||
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
||||
unsafe_put_user(info.status, &infop->si_status, Efault);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return err;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -1684,7 +1684,7 @@ COMPAT_SYSCALL_DEFINE5(waitid,
|
||||
if (!infop)
|
||||
return err;
|
||||
|
||||
if (!user_access_begin(infop, sizeof(*infop)))
|
||||
if (!user_write_access_begin(infop, sizeof(*infop)))
|
||||
return -EFAULT;
|
||||
|
||||
unsafe_put_user(signo, &infop->si_signo, Efault);
|
||||
@@ -1693,10 +1693,10 @@ COMPAT_SYSCALL_DEFINE5(waitid,
|
||||
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
||||
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
||||
unsafe_put_user(info.status, &infop->si_status, Efault);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return err;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user