aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-05-14 19:27:32 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-05-21 13:16:18 -0400
commit4c48abe91be03d191d0c20cc755877da2cb35622 (patch)
tree22c13f3cb38d7c6978bd37741c552c79e13b48d2
parent76d9871e1122aabc086e7aade5251b1e5124cbb9 (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.c40
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;
1637Efault:
1638 user_access_end();
1639 return -EFAULT;
1637} 1640}
1638 1641
1639static long kernel_wait4(pid_t upid, int __user *stat_addr, 1642static 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;
1754Efault:
1755 user_access_end();
1756 return -EFAULT;
1747} 1757}
1748#endif 1758#endif