diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-05-14 19:27:32 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-05-21 13:16:18 -0400 |
commit | 4c48abe91be03d191d0c20cc755877da2cb35622 (patch) | |
tree | 22c13f3cb38d7c6978bd37741c552c79e13b48d2 | |
parent | 76d9871e1122aabc086e7aade5251b1e5124cbb9 (diff) |
waitid(): switch copyout of siginfo to unsafe_put_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | kernel/exit.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 97db9ee03f90..f3b8c3a87bc1 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, | |||
1625 | if (!infop) | 1625 | if (!infop) |
1626 | return err; | 1626 | return err; |
1627 | 1627 | ||
1628 | if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || | 1628 | user_access_begin(); |
1629 | put_user(0, &infop->si_errno) || | 1629 | unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); |
1630 | put_user((short)info.cause, &infop->si_code) || | 1630 | unsafe_put_user(0, &infop->si_errno, Efault); |
1631 | put_user(info.pid, &infop->si_pid) || | 1631 | unsafe_put_user((short)info.cause, &infop->si_code, Efault); |
1632 | put_user(info.uid, &infop->si_uid) || | 1632 | unsafe_put_user(info.pid, &infop->si_pid, Efault); |
1633 | put_user(info.status, &infop->si_status)) | 1633 | unsafe_put_user(info.uid, &infop->si_uid, Efault); |
1634 | err = -EFAULT; | 1634 | unsafe_put_user(info.status, &infop->si_status, Efault); |
1635 | 1635 | user_access_end(); | |
1636 | return err; | 1636 | return err; |
1637 | Efault: | ||
1638 | user_access_end(); | ||
1639 | return -EFAULT; | ||
1637 | } | 1640 | } |
1638 | 1641 | ||
1639 | static long kernel_wait4(pid_t upid, int __user *stat_addr, | 1642 | static long kernel_wait4(pid_t upid, int __user *stat_addr, |
@@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid, | |||
1736 | return -EFAULT; | 1739 | return -EFAULT; |
1737 | } | 1740 | } |
1738 | 1741 | ||
1739 | if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || | 1742 | if (!infop) |
1740 | put_user(0, &infop->si_errno) || | 1743 | return err; |
1741 | put_user((short)info.cause, &infop->si_code) || | 1744 | |
1742 | put_user(info.pid, &infop->si_pid) || | 1745 | user_access_begin(); |
1743 | put_user(info.uid, &infop->si_uid) || | 1746 | unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); |
1744 | put_user(info.status, &infop->si_status)) | 1747 | unsafe_put_user(0, &infop->si_errno, Efault); |
1745 | err = -EFAULT; | 1748 | unsafe_put_user((short)info.cause, &infop->si_code, Efault); |
1749 | unsafe_put_user(info.pid, &infop->si_pid, Efault); | ||
1750 | unsafe_put_user(info.uid, &infop->si_uid, Efault); | ||
1751 | unsafe_put_user(info.status, &infop->si_status, Efault); | ||
1752 | user_access_end(); | ||
1746 | return err; | 1753 | return err; |
1754 | Efault: | ||
1755 | user_access_end(); | ||
1756 | return -EFAULT; | ||
1747 | } | 1757 | } |
1748 | #endif | 1758 | #endif |