Loading kernel/exit.c +25 −15 Original line number Original line Diff line number Diff line Loading @@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, if (!infop) if (!infop) return err; return err; if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || user_access_begin(); put_user(0, &infop->si_errno) || unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); put_user((short)info.cause, &infop->si_code) || unsafe_put_user(0, &infop->si_errno, Efault); put_user(info.pid, &infop->si_pid) || unsafe_put_user((short)info.cause, &infop->si_code, Efault); put_user(info.uid, &infop->si_uid) || unsafe_put_user(info.pid, &infop->si_pid, Efault); put_user(info.status, &infop->si_status)) unsafe_put_user(info.uid, &infop->si_uid, Efault); err = -EFAULT; unsafe_put_user(info.status, &infop->si_status, Efault); user_access_end(); return err; return err; Efault: user_access_end(); return -EFAULT; } } static long kernel_wait4(pid_t upid, int __user *stat_addr, static long kernel_wait4(pid_t upid, int __user *stat_addr, Loading Loading @@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid, return -EFAULT; return -EFAULT; } } if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || if (!infop) put_user(0, &infop->si_errno) || return err; put_user((short)info.cause, &infop->si_code) || put_user(info.pid, &infop->si_pid) || user_access_begin(); put_user(info.uid, &infop->si_uid) || unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); put_user(info.status, &infop->si_status)) unsafe_put_user(0, &infop->si_errno, Efault); err = -EFAULT; unsafe_put_user((short)info.cause, &infop->si_code, Efault); 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(); return err; return err; Efault: user_access_end(); return -EFAULT; } } #endif #endif Loading
kernel/exit.c +25 −15 Original line number Original line Diff line number Diff line Loading @@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, if (!infop) if (!infop) return err; return err; if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || user_access_begin(); put_user(0, &infop->si_errno) || unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); put_user((short)info.cause, &infop->si_code) || unsafe_put_user(0, &infop->si_errno, Efault); put_user(info.pid, &infop->si_pid) || unsafe_put_user((short)info.cause, &infop->si_code, Efault); put_user(info.uid, &infop->si_uid) || unsafe_put_user(info.pid, &infop->si_pid, Efault); put_user(info.status, &infop->si_status)) unsafe_put_user(info.uid, &infop->si_uid, Efault); err = -EFAULT; unsafe_put_user(info.status, &infop->si_status, Efault); user_access_end(); return err; return err; Efault: user_access_end(); return -EFAULT; } } static long kernel_wait4(pid_t upid, int __user *stat_addr, static long kernel_wait4(pid_t upid, int __user *stat_addr, Loading Loading @@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid, return -EFAULT; return -EFAULT; } } if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) || if (!infop) put_user(0, &infop->si_errno) || return err; put_user((short)info.cause, &infop->si_code) || put_user(info.pid, &infop->si_pid) || user_access_begin(); put_user(info.uid, &infop->si_uid) || unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault); put_user(info.status, &infop->si_status)) unsafe_put_user(0, &infop->si_errno, Efault); err = -EFAULT; unsafe_put_user((short)info.cause, &infop->si_code, Efault); 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(); return err; return err; Efault: user_access_end(); return -EFAULT; } } #endif #endif