wait_noreap_copyout(): check for ->wo_info != NULL
Current behaviour of sys_waitid() looks odd. If user passes infop == NULL, sys_waitid() returns success. When user additionally specifies flag WNOWAIT, sys_waitid() returns -EFAULT on the same conditions. When user combines WNOWAIT with WCONTINUED, sys_waitid() again returns success. This patch adds check for ->wo_info in wait_noreap_copyout(). User-visible change: starting from this commit, sys_waitid() always checks infop != NULL and does not fail if it is NULL. Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Cc: Roland McGrath <roland@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
dfe16dfa4a
Коммит
b6fe2d117e
|
@ -1140,18 +1140,20 @@ static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p,
|
|||
|
||||
put_task_struct(p);
|
||||
infop = wo->wo_info;
|
||||
if (!retval)
|
||||
retval = put_user(SIGCHLD, &infop->si_signo);
|
||||
if (!retval)
|
||||
retval = put_user(0, &infop->si_errno);
|
||||
if (!retval)
|
||||
retval = put_user((short)why, &infop->si_code);
|
||||
if (!retval)
|
||||
retval = put_user(pid, &infop->si_pid);
|
||||
if (!retval)
|
||||
retval = put_user(uid, &infop->si_uid);
|
||||
if (!retval)
|
||||
retval = put_user(status, &infop->si_status);
|
||||
if (infop) {
|
||||
if (!retval)
|
||||
retval = put_user(SIGCHLD, &infop->si_signo);
|
||||
if (!retval)
|
||||
retval = put_user(0, &infop->si_errno);
|
||||
if (!retval)
|
||||
retval = put_user((short)why, &infop->si_code);
|
||||
if (!retval)
|
||||
retval = put_user(pid, &infop->si_pid);
|
||||
if (!retval)
|
||||
retval = put_user(uid, &infop->si_uid);
|
||||
if (!retval)
|
||||
retval = put_user(status, &infop->si_status);
|
||||
}
|
||||
if (!retval)
|
||||
retval = pid;
|
||||
return retval;
|
||||
|
|
Загрузка…
Ссылка в новой задаче