From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752144AbdEOWiM (ORCPT ); Mon, 15 May 2017 18:38:12 -0400 Received: from zeniv.linux.org.uk ([195.92.253.2]:34616 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752016AbdEOWhS (ORCPT ); Mon, 15 May 2017 18:37:18 -0400 From: Al Viro To: linux-kernel@vger.kernel.org Cc: Linus Torvalds , Ingo Molnar , Oleg Nesterov , Peter Zijlstra , Christoph Hellwig Subject: [PATCH 8/8] waitid(): switch copyout of siginfo to unsafe_put_user() Date: Mon, 15 May 2017 23:37:16 +0100 Message-Id: <20170515223716.2085-8-viro@ZenIV.linux.org.uk> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170515223716.2085-1-viro@ZenIV.linux.org.uk> References: <20170515223157.GM390@ZenIV.linux.org.uk> <20170515223716.2085-1-viro@ZenIV.linux.org.uk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Al Viro Signed-off-by: Al Viro --- 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