[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20170515223716.2085-8-viro@ZenIV.linux.org.uk>
Date: Mon, 15 May 2017 23:37:16 +0100
From: Al Viro <viro@...IV.linux.org.uk>
To: linux-kernel@...r.kernel.org
Cc: Linus Torvalds <torvalds@...ux-foundation.org>,
Ingo Molnar <mingo@...nel.org>,
Oleg Nesterov <oleg@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Christoph Hellwig <hch@....de>
Subject: [PATCH 8/8] waitid(): switch copyout of siginfo to unsafe_put_user()
From: Al Viro <viro@...iv.linux.org.uk>
Signed-off-by: Al Viro <viro@...iv.linux.org.uk>
---
kernel/exit.c | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/kernel/exit.c b/kernel/exit.c
index e93876b06b28..a13dd4d0dc34 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1625,15 +1625,18 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
if (!infop)
return err;
- if (put_user(err ? 0 : SIGCHLD, &infop->si_signo) ||
- put_user(0, &infop->si_errno) ||
- put_user((short)info.why, &infop->si_code) ||
- put_user(info.pid, &infop->si_pid) ||
- put_user(info.uid, &infop->si_uid) ||
- put_user(info.status, &infop->si_status))
- err = -EFAULT;
-
+ user_access_begin();
+ unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault);
+ unsafe_put_user(0, &infop->si_errno, Efault);
+ unsafe_put_user((short)info.why, &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;
+Efault:
+ user_access_end();
+ return -EFAULT;
}
static long kernel_wait4(pid_t upid, int __user *stat_addr,
@@ -1736,13 +1739,20 @@ COMPAT_SYSCALL_DEFINE5(waitid,
return -EFAULT;
}
- if (put_user(err ? 0 : SIGCHLD, &uinfo->si_signo) ||
- put_user(0, &uinfo->si_errno) ||
- put_user((short)info.why, &uinfo->si_code) ||
- put_user(info.pid, &uinfo->si_pid) ||
- put_user(info.uid, &uinfo->si_uid) ||
- put_user(info.status, &uinfo->si_status))
- err = -EFAULT;
+ if (!uinfo)
+ return err;
+
+ user_access_begin();
+ unsafe_put_user(err ? 0 : SIGCHLD, &infop->si_signo, Efault);
+ unsafe_put_user(0, &infop->si_errno, Efault);
+ unsafe_put_user((short)info.why, &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;
+Efault:
+ user_access_end();
+ return -EFAULT;
}
#endif
--
2.11.0
Powered by blists - more mailing lists