Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp579054imu; Thu, 20 Dec 2018 01:45:01 -0800 (PST) X-Google-Smtp-Source: AFSGD/XuikH6M8MpTaFNpdhBPLL10oOBsvAfZmbAlLrorG6FRCdXfx9960FqpKgQpsfCziUlEOLZ X-Received: by 2002:a62:d005:: with SMTP id p5mr23679944pfg.175.1545299101128; Thu, 20 Dec 2018 01:45:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545299101; cv=none; d=google.com; s=arc-20160816; b=HR1nyT/6H3YAqlP1TZ5QZK4V7picHEU7SuXIgo6fZt1vlXJnfUr0OGWtIRBGvZT9ui or7MOJgziDpXBoOYZGYV7qN1sfRWb1JqOj98bAuMdrVbUR3LkoJM9+XXAW7FohvO80sm dAcsKgNYxbUyp+PBJReovt3yxsn0cJk0F5tQj+I35tZIee7XgUitIzvXE1YSO8fmoYqq r0sqAQgojmpn8mEKEoVr8Q2CNxgVeasmGH+CiX3z8j1EpuQtvFoqOpGPLnc+DOmiujt+ M7+kFpJwZ4wbnzuRokRtMSQS+ywsidhbcxaUsexwS2A1gA8aBKNShEyTKfb49Dz0Hx3q 3HEA== 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=oC/o0dyp6M71oDamKR5l3LmfRcsUFITUzNr1T4b6AEE=; b=yyI1qv2toDS+ts07houEXRwt8QB7p6ITB8r1odjiRbSZ6SfU6vhhkMfBxQXNsOiMWl GIVq0oSp3FuwA5eE0N3mR30AaaAVpjPYQ6tjqfqpMvHXYJ/2ScoV0wDanh1igYjtuTCB DqeY3P6xs2PXeYv+lkG0t8tvHTDqJBTsg1Z4x8JBsCu0TtPLhP+nUdPId7bvkUqGnniO a2j5HPhiGyYblkeZ9x9WcMhmMDKTkye7C6AI/z57SeUYSCwrS3LcjMcU/1/2plsRk7Eq c7s/KKpMh5uIxZ1kooDEL/IMzq2f1Epf0stXELAKhRDmriNma6he6nXVqpulaxruOoV8 PI5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mgD4YCu1; 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 a11si18425255pln.78.2018.12.20.01.44.45; Thu, 20 Dec 2018 01:45:01 -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=mgD4YCu1; 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 S1731419AbeLTJWu (ORCPT + 99 others); Thu, 20 Dec 2018 04:22:50 -0500 Received: from mail.kernel.org ([198.145.29.99]:47174 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731409AbeLTJWr (ORCPT ); Thu, 20 Dec 2018 04:22:47 -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 AB83B20449; Thu, 20 Dec 2018 09:22:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1545297766; bh=UeQvl/Sk60kNA7HShlvUIMcoTodC29SWPXikt+pbdjo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mgD4YCu1jEPckN80J0knw3Ght+dIuuY9hiwBTznxX/abVcpOhkeN5Pzb3Za1t0wZg t9WT60C2uLBDN6IE/hspk2i22P53q+AfnjWCQ2KoB1P8gOELRJmsiw94X9LzVF//GG X3FGfJuN+CGdmmAYHGDXXCcfckygWwD1JL4ZeZZM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Arnd Bergmann , Dominik Brodowski , "Eric W. Biederman" , Andrew Morton , Al Viro , Oleg Nesterov , Steve McIntyre , Steve McIntyre <93sam@debian.org>, Will Deacon , Catalin Marinas Subject: [PATCH 4.9 01/61] signal: Introduce COMPAT_SIGMINSTKSZ for use in compat_sys_sigaltstack Date: Thu, 20 Dec 2018 10:18:01 +0100 Message-Id: <20181220085843.804223151@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20181220085843.743900603@linuxfoundation.org> References: <20181220085843.743900603@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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: Will Deacon commit 22839869f21ab3850fbbac9b425ccc4c0023926f upstream. The sigaltstack(2) system call fails with -ENOMEM if the new alternative signal stack is found to be smaller than SIGMINSTKSZ. On architectures such as arm64, where the native value for SIGMINSTKSZ is larger than the compat value, this can result in an unexpected error being reported to a compat task. See, for example: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=904385 This patch fixes the problem by extending do_sigaltstack to take the minimum signal stack size as an additional parameter, allowing the native and compat system call entry code to pass in their respective values. COMPAT_SIGMINSTKSZ is just defined as SIGMINSTKSZ if it has not been defined by the architecture. Cc: Arnd Bergmann Cc: Dominik Brodowski Cc: "Eric W. Biederman" Cc: Andrew Morton Cc: Al Viro Cc: Oleg Nesterov Reported-by: Steve McIntyre Tested-by: Steve McIntyre <93sam@debian.org> Signed-off-by: Will Deacon Signed-off-by: Catalin Marinas [signal: Fix up cherry-pick conflicts for 22839869f21a] Signed-off-by: Steve McIntyre <93sam@debian.org> Signed-off-by: Greg Kroah-Hartman --- include/linux/compat.h | 3 +++ kernel/signal.c | 17 ++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -67,6 +67,9 @@ typedef struct compat_sigaltstack { compat_size_t ss_size; } compat_stack_t; #endif +#ifndef COMPAT_MINSIGSTKSZ +#define COMPAT_MINSIGSTKSZ MINSIGSTKSZ +#endif #define compat_jiffies_to_clock_t(x) \ (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3116,7 +3116,8 @@ int do_sigaction(int sig, struct k_sigac } static int -do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp) +do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp, + size_t min_ss_size) { stack_t oss; int error; @@ -3155,9 +3156,8 @@ do_sigaltstack (const stack_t __user *us ss_size = 0; ss_sp = NULL; } else { - error = -ENOMEM; - if (ss_size < MINSIGSTKSZ) - goto out; + if (unlikely(ss_size < min_ss_size)) + return -ENOMEM; } current->sas_ss_sp = (unsigned long) ss_sp; @@ -3180,12 +3180,14 @@ out: } SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) { - return do_sigaltstack(uss, uoss, current_user_stack_pointer()); + return do_sigaltstack(uss, uoss, current_user_stack_pointer(), + MINSIGSTKSZ); } int restore_altstack(const stack_t __user *uss) { - int err = do_sigaltstack(uss, NULL, current_user_stack_pointer()); + int err = do_sigaltstack(uss, NULL, current_user_stack_pointer(), + MINSIGSTKSZ); /* squash all but EFAULT for now */ return err == -EFAULT ? err : 0; } @@ -3226,7 +3228,8 @@ COMPAT_SYSCALL_DEFINE2(sigaltstack, set_fs(KERNEL_DS); ret = do_sigaltstack((stack_t __force __user *) (uss_ptr ? &uss : NULL), (stack_t __force __user *) &uoss, - compat_user_stack_pointer()); + compat_user_stack_pointer(), + COMPAT_MINSIGSTKSZ); set_fs(seg); if (ret >= 0 && uoss_ptr) { if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(compat_stack_t)) ||