Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2419247imu; Wed, 21 Nov 2018 11:19:04 -0800 (PST) X-Google-Smtp-Source: AFSGD/UFELBRaUujuCjyX88fGnKOv8WjybUXfkye3A/UBBhR8qF+nQP1gq6FGjp/Er9OS8erbuJH X-Received: by 2002:a63:8f45:: with SMTP id r5mr7020369pgn.222.1542827944492; Wed, 21 Nov 2018 11:19:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542827944; cv=none; d=google.com; s=arc-20160816; b=GkiJ+vtjJ4WEwM3qcdB84RW18HisCBQ6bxuT2TAnU7HhTDwBtzpCzmPKhCbYBO+z0D PbCNRZNts7q2vZ3zCrKWjcy++f/iU7tGwfn6DTZAeUDbLvUjBiD8E6qkIUyFfB4e2Tb4 S6eR9G8513x/8iIboJXBQYC/gmj4rRDa9O3+ONIiWuADgY1J4qT+8rTJvUzVDY8Jl8OK kbRbFifFqLQzIfa7plmVrQEHH/xAWdua/0xm/tv2LYvpv6zEIgwcnNHlZRNPQq7FJuVd dYIXnNRH9DPwx0bwFURMV2HWGtO8mtHhDv2baJf2quTlJQtbc5Je+qyasBu6yy50yKM5 NKMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=pLYQXlYLCBmTYBKbA2b7eOHtz5oqMSzk0LO1nma1WR8=; b=Gs0NiaVBLlo8H5CGoLti4sWNesJhqdxvb1YIEQ5RHQSPA8Nkr9UdBxySpukkqOMvKn mmakvt7AMKgmqNSi9+kglnYsCRlCKN+/6oFmcpJU4gntYiT2fji/llOnUzFE4307p8ew yftMIwxF2DlQHPHjo2xEo8s6FAY+rxSTkbeuqJiB5Yz/Wz4IT1EoDafnRTDMm1UJCmNw kkmVBaRgA6tnXBd2mUOjHPBjHbdCC78MZHvshIoRbWeD6M/gSKiLYQlUN3pTScY2z2sM yWfvuyKrquuiDrgJmrGrupFiMoKVZuLxmred7z+MHjWRuDsdkxw0Q5Ho7iJHRR84Pfag ND4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="puT/BgSk"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k142si30930652pfd.174.2018.11.21.11.18.49; Wed, 21 Nov 2018 11:19:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="puT/BgSk"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389038AbeKVFrL (ORCPT + 99 others); Thu, 22 Nov 2018 00:47:11 -0500 Received: from mail.kernel.org ([198.145.29.99]:42588 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389030AbeKVFrJ (ORCPT ); Thu, 22 Nov 2018 00:47:09 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DEAD32151B; Wed, 21 Nov 2018 19:11:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1542827496; bh=KcY7v4pG0KLn+LAyF4TcGZW+AxpciugA3czOiOO8T3U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=puT/BgSkyocglRfnZ4hrlOXGMZGaNaOyGqjjXl6lrL8cWxG/D9qmP9q67EvpBKl6f driKh+HSjGJ+VxGzH86mPmFWAKw/liZNtic3MSbaql8UcRCM5Tr0gt1kZq7hk5Ddpp ykDREvNKYHH/bT3V5Wzzh7NMieeYPcgFTigdp0e4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mark Rutland , Russell King , "David A. Long" Subject: [PATCH 4.9 54/59] ARM: signal: copy registers using __copy_from_user() Date: Wed, 21 Nov 2018 20:07:09 +0100 Message-Id: <20181121183510.426307388@linuxfoundation.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181121183508.262873520@linuxfoundation.org> References: <20181121183508.262873520@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Russell King Commit c32cd419d6650e42b9cdebb83c672ec945e6bd7e upstream. __get_user_error() is used as a fast accessor to make copying structure members in the signal handling path as efficient as possible. However, with software PAN and the recent Spectre variant 1, the efficiency is reduced as these are no longer fast accessors. In the case of software PAN, it has to switch the domain register around each access, and with Spectre variant 1, it would have to repeat the access_ok() check for each access. It becomes much more efficient to use __copy_from_user() instead, so let's use this for the ARM integer registers. Acked-by: Mark Rutland Signed-off-by: Russell King Signed-off-by: David A. Long Signed-off-by: Greg Kroah-Hartman --- arch/arm/kernel/signal.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -141,6 +141,7 @@ struct rt_sigframe { static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf) { + struct sigcontext context; struct aux_sigframe __user *aux; sigset_t set; int err; @@ -149,23 +150,26 @@ static int restore_sigframe(struct pt_re if (err == 0) set_current_blocked(&set); - __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err); - __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err); - __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err); - __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err); - __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err); - __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err); - __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err); - __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err); - __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err); - __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err); - __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err); - __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err); - __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err); - __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err); - __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err); - __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err); - __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err); + err |= __copy_from_user(&context, &sf->uc.uc_mcontext, sizeof(context)); + if (err == 0) { + regs->ARM_r0 = context.arm_r0; + regs->ARM_r1 = context.arm_r1; + regs->ARM_r2 = context.arm_r2; + regs->ARM_r3 = context.arm_r3; + regs->ARM_r4 = context.arm_r4; + regs->ARM_r5 = context.arm_r5; + regs->ARM_r6 = context.arm_r6; + regs->ARM_r7 = context.arm_r7; + regs->ARM_r8 = context.arm_r8; + regs->ARM_r9 = context.arm_r9; + regs->ARM_r10 = context.arm_r10; + regs->ARM_fp = context.arm_fp; + regs->ARM_ip = context.arm_ip; + regs->ARM_sp = context.arm_sp; + regs->ARM_lr = context.arm_lr; + regs->ARM_pc = context.arm_pc; + regs->ARM_cpsr = context.arm_cpsr; + } err |= !valid_user_regs(regs);