Skip to content

Commit 4c48abe

Browse files
author
Al Viro
committed
waitid(): switch copyout of siginfo to unsafe_put_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 76d9871 commit 4c48abe

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

kernel/exit.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
16251625
if (!infop)
16261626
return err;
16271627

1628-
if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) ||
1629-
put_user(0, &infop->si_errno) ||
1630-
put_user((short)info.cause, &infop->si_code) ||
1631-
put_user(info.pid, &infop->si_pid) ||
1632-
put_user(info.uid, &infop->si_uid) ||
1633-
put_user(info.status, &infop->si_status))
1634-
err = -EFAULT;
1635-
1628+
user_access_begin();
1629+
unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault);
1630+
unsafe_put_user(0, &infop->si_errno, Efault);
1631+
unsafe_put_user((short)info.cause, &infop->si_code, Efault);
1632+
unsafe_put_user(info.pid, &infop->si_pid, Efault);
1633+
unsafe_put_user(info.uid, &infop->si_uid, Efault);
1634+
unsafe_put_user(info.status, &infop->si_status, Efault);
1635+
user_access_end();
16361636
return err;
1637+
Efault:
1638+
user_access_end();
1639+
return -EFAULT;
16371640
}
16381641

16391642
static long kernel_wait4(pid_t upid, int __user *stat_addr,
@@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid,
17361739
return -EFAULT;
17371740
}
17381741

1739-
if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) ||
1740-
put_user(0, &infop->si_errno) ||
1741-
put_user((short)info.cause, &infop->si_code) ||
1742-
put_user(info.pid, &infop->si_pid) ||
1743-
put_user(info.uid, &infop->si_uid) ||
1744-
put_user(info.status, &infop->si_status))
1745-
err = -EFAULT;
1742+
if (!infop)
1743+
return err;
1744+
1745+
user_access_begin();
1746+
unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault);
1747+
unsafe_put_user(0, &infop->si_errno, 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();
17461753
return err;
1754+
Efault:
1755+
user_access_end();
1756+
return -EFAULT;
17471757
}
17481758
#endif

0 commit comments

Comments
 (0)