From patchwork Wed Nov 4 21:18:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883111 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59809C00A89 for ; Thu, 5 Nov 2020 04:22:36 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BE59520795 for ; Thu, 5 Nov 2020 04:22:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="QTmWEtv8"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="nUEdRuvc"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="Z3VA8DQp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BE59520795 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DNQaB8hxgj1EPUP4oiWjP8tFb7u/O7qy+w7SUN96znU=; b=QTmWEtv8/Z3TmUzkUVPF0P0Re fgdZMGXopOgV0zJ+CLuMbCDBjASyGb3KNW6Z2lksncFlZod4PH64oziLPnMjojWLMqOy9W6pnnSTj N0zKDi5epjlO3ZgGtXMdteR567JajpkD4MPrOcQf2UiJ7T3pPgZN5EthnkRfKJ5AZREEmGyrOirhQ svCU5HlVmzy/RgVxZCOT/k1ZrTJeOou3WfVpynWfyeCmOqbIHUFZhCAaOfMBom22SxhpvMLl8bWI2 IIcdWFqaZrHzUfR67bbyTr/slVIp7afk16RFhp+ny/G7thG2HwJWJb7r7GMaAa52ROUnmTrCE81kN pUz2BB/eg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaWmk-00069Z-PS; Thu, 05 Nov 2020 04:22:06 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7v-00016k-70 for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=nUEdRuvcGWkc39znVi+aowo4YB lFnk2z+q8/ZPVgLGCRvMBJby3uqlpiTAN6C+tORRAaivDzM+Cu7j9EkFiD2ljyWDU2Bz75eqFIV5W O5fce825I2ptOaFNJFzCNx7vE9pag7naCT60p6JlxuB7BAlAVWgtMle/HEmcRxCHX7QE7Udt4XbKB aGqUADdH8lNBd034UlmTTuAB2kvAhhgFJjICukf4WL/mCfVOp+YoWTTEK03W8p3s4k2pw2Gxwr2Q9 RYLl9sotxC5sDew6uQ1COixfBYrtqqruK27wI5mywZ4RCDDvqzz5TawwcK9kx6zd0Ep+ARiYIVXJf GvsqIu4g==; Received: from mail-qv1-xf49.google.com ([2607:f8b0:4864:20::f49]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBp-0000po-Ug for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:39 +0000 Received: by mail-qv1-xf49.google.com with SMTP id eh4so13595503qvb.12 for ; Wed, 04 Nov 2020 13:19:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=Z3VA8DQpW4o3zVreJ8zDQuX/0+7spoK3clb77ks0FqUDvWL2RlOFqhkk5DdpCIyZU3 qYbfRjx2cV6MtFRaH6m7D/vxXnq71d2Zbn4vCQW68i3aXUBAGCCu6zEPfAIffu2ENg52 mfl1B4DwCwKt43u/n65LwkgTeHEhW9y3YqCV3Nuwh/4wjIGMbN6mFVxVPXLWLENfMHXn KdZpXKLTo3z54pU8ZkGlBINPKP5Vf0Hz57TSun8DLxeeyecuATpqiXBcHCeTm3ihnJFi cgrr6vHhUYOPbat5dcCfOv7qUVP237PEp5oTneQYxBnDjba0A8Bq4f00aEHdA8m38Sn2 gkRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=GaFCM6bifbtTW2cB2zAXMCcU73qHvwqHKK0GRq0zvhXaHk+JSiCl+Jjp9IhXv3V1TF atR0S7EHwe04Molmehyy+dTrjXXSop3M4TT97fZ3SdG9ts+T3wn9hpgeUbvtg2nDGoWr 9yXxWMtz/XPmsL8bnOxvGXhW8IIm8ScfRmGujbpNcMZ6JhSZesoSWjj0WJ/28vliDctN M7wz7P+mOjSTshOLs2WfW5wsjItOzcVnEvA+RVihIWtJLfvYu0oFYq0+sdk7I55CJrjL /CWyInBnZocq0mQb9yR4mK3d/J3D1cp8lVGgYvJ/nBmWPv+aujRUdCpkwt80a5AiyVE/ A4GQ== X-Gm-Message-State: AOAM531Yzr+lAj1rDabug59g2twqlZKo2WoW98FuohJZ2wU0ebo7dotW WLkXfThd+fNs8yDyW6QnHgD5lnQ= X-Google-Smtp-Source: ABdhPJzsRXpiZJYoEKebRD9os6+E8lvR6Uq9oXM8YM8a3SXPEK8Yka90WnvhpOXxTj0YLSwcRBlHr4c= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:ad4:43ca:: with SMTP id o10mr35382582qvs.33.1604524706362; Wed, 04 Nov 2020 13:18:26 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:07 -0800 In-Reply-To: Message-Id: <4d826a62121153d54d7e36fc8a402c97e2106764.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 4/8] signal: deduplicate code dealing with common _sigfault fields From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211934_423613_6748DFD0 X-CRM114-Status: GOOD ( 14.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org We're about to add more common _sigfault fields, so deduplicate the existing code for initializing _sigfault fields in {send,force}_sig_*, and for copying _sigfault fields in copy_siginfo_to_external32 and post_copy_siginfo_from_user32, to reduce the number of places that will need to be updated by upcoming changes. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/I4f56174e1b7b2bf4a3c8139e6879cbfd52750a24 Acked-by: "Eric W. Biederman" --- include/linux/signal.h | 13 ++++++ kernel/signal.c | 101 ++++++++++++++++------------------------- 2 files changed, 53 insertions(+), 61 deletions(-) diff --git a/include/linux/signal.h b/include/linux/signal.h index b256f9c65661..e9fb05041e7a 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -50,6 +50,19 @@ enum siginfo_layout { enum siginfo_layout siginfo_layout(unsigned sig, int si_code); +static inline bool siginfo_layout_is_fault(enum siginfo_layout layout) +{ + switch (layout) { + case SIL_FAULT: + case SIL_FAULT_MCEERR: + case SIL_FAULT_BNDERR: + case SIL_FAULT_PKUERR: + return true; + default: + return false; + } +} + /* * Define some primitives to manipulate sigset_t. */ diff --git a/kernel/signal.c b/kernel/signal.c index ef8f2a28d37c..74e7315c24db 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1650,6 +1650,15 @@ void force_sigsegv(int sig) force_sig(SIGSEGV); } +static void set_sigfault_common_fields(struct kernel_siginfo *info, int sig, + int code, void __user *addr) +{ + info->si_signo = sig; + info->si_errno = 0; + info->si_code = code; + info->si_addr = addr; +} + int force_sig_fault_to_task(int sig, int code, void __user *addr ___ARCH_SI_TRAPNO(int trapno) ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) @@ -1658,10 +1667,7 @@ int force_sig_fault_to_task(int sig, int code, void __user *addr struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = sig; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, sig, code, addr); #ifdef __ARCH_SI_TRAPNO info.si_trapno = trapno; #endif @@ -1690,10 +1696,7 @@ int send_sig_fault(int sig, int code, void __user *addr struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = sig; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, sig, code, addr); #ifdef __ARCH_SI_TRAPNO info.si_trapno = trapno; #endif @@ -1711,10 +1714,7 @@ int force_sig_mceerr(int code, void __user *addr, short lsb) WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); clear_siginfo(&info); - info.si_signo = SIGBUS; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGBUS, code, addr); info.si_addr_lsb = lsb; return force_sig_info(&info); } @@ -1725,10 +1725,7 @@ int send_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct * WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); clear_siginfo(&info); - info.si_signo = SIGBUS; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGBUS, code, addr); info.si_addr_lsb = lsb; return send_sig_info(info.si_signo, &info, t); } @@ -1739,10 +1736,7 @@ int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGSEGV; - info.si_errno = 0; - info.si_code = SEGV_BNDERR; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGSEGV, SEGV_BNDERR, addr); info.si_lower = lower; info.si_upper = upper; return force_sig_info(&info); @@ -1754,10 +1748,7 @@ int force_sig_pkuerr(void __user *addr, u32 pkey) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGSEGV; - info.si_errno = 0; - info.si_code = SEGV_PKUERR; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGSEGV, SEGV_PKUERR, addr); info.si_pkey = pkey; return force_sig_info(&info); } @@ -1771,10 +1762,8 @@ int force_sig_ptrace_errno_trap(int errno, void __user *addr) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGTRAP; + set_sigfault_common_fields(&info, SIGTRAP, TRAP_HWBKPT, addr); info.si_errno = errno; - info.si_code = TRAP_HWBKPT; - info.si_addr = addr; return force_sig_info(&info); } @@ -3267,12 +3256,23 @@ int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from) void copy_siginfo_to_external32(struct compat_siginfo *to, const struct kernel_siginfo *from) { + enum siginfo_layout layout = + siginfo_layout(from->si_signo, from->si_code); + memset(to, 0, sizeof(*to)); to->si_signo = from->si_signo; to->si_errno = from->si_errno; to->si_code = from->si_code; - switch(siginfo_layout(from->si_signo, from->si_code)) { + + if (siginfo_layout_is_fault(layout)) { + to->si_addr = ptr_to_compat(from->si_addr); +#ifdef __ARCH_SI_TRAPNO + to->si_trapno = from->si_trapno; +#endif + } + + switch (layout) { case SIL_KILL: to->si_pid = from->si_pid; to->si_uid = from->si_uid; @@ -3287,31 +3287,15 @@ void copy_siginfo_to_external32(struct compat_siginfo *to, to->si_fd = from->si_fd; break; case SIL_FAULT: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif break; case SIL_FAULT_MCEERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_addr_lsb = from->si_addr_lsb; break; case SIL_FAULT_BNDERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_lower = ptr_to_compat(from->si_lower); to->si_upper = ptr_to_compat(from->si_upper); break; case SIL_FAULT_PKUERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_pkey = from->si_pkey; break; case SIL_CHLD: @@ -3348,11 +3332,22 @@ int __copy_siginfo_to_user32(struct compat_siginfo __user *to, static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, const struct compat_siginfo *from) { + enum siginfo_layout layout = + siginfo_layout(from->si_signo, from->si_code); + clear_siginfo(to); to->si_signo = from->si_signo; to->si_errno = from->si_errno; to->si_code = from->si_code; - switch(siginfo_layout(from->si_signo, from->si_code)) { + + if (siginfo_layout_is_fault(layout)) { + to->si_addr = compat_ptr(from->si_addr); +#ifdef __ARCH_SI_TRAPNO + to->si_trapno = from->si_trapno; +#endif + } + + switch (layout) { case SIL_KILL: to->si_pid = from->si_pid; to->si_uid = from->si_uid; @@ -3367,31 +3362,15 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, to->si_fd = from->si_fd; break; case SIL_FAULT: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif break; case SIL_FAULT_MCEERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_addr_lsb = from->si_addr_lsb; break; case SIL_FAULT_BNDERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_lower = compat_ptr(from->si_lower); to->si_upper = compat_ptr(from->si_upper); break; case SIL_FAULT_PKUERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_pkey = from->si_pkey; break; case SIL_CHLD: