From patchwork Wed Oct 31 23:08:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 149902 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp100949ljp; Wed, 31 Oct 2018 16:10:15 -0700 (PDT) X-Google-Smtp-Source: AJdET5cR4+SwwRykGKgCsMMg03Lrso7rMeJAvUIpfUNtlc5iJL4Q8/B6PJ4vabrjAen60Q2OwqsG X-Received: by 2002:a63:4d5d:: with SMTP id n29-v6mr4948197pgl.270.1541027414942; Wed, 31 Oct 2018 16:10:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541027414; cv=none; d=google.com; s=arc-20160816; b=sO2jlT4oM1eMp6WNcXgcOE7/GCyLjnDQmr5DH/pFtT4xAXdvKlVZd6bpDythQ/H2O7 1VRU7IauYGQNvxQ4qv4rIZK5cM8+eFkJ5hBXP8XoixZrKz5Qne7ejkDZ+wy2cxOSsitl y6HffUwpRGmLyf19ZMgHyVwwSQqAvpiXtVBE1KYDCezgIZ2SHpjp8nrvROMnm0LTe8oK u+YznpqW/zDONJb9uG3AzdaHjQMz1F6rFYvneuorZ3q2Mu8qZa8OFDYQ0bLlGE1NDiOz Ba6QP/LINdzjRL/X39SF0p0h0CE4L9eBuehKxCjUNhb/XgR8rKlJ+TyPl9pHeFB9ByP0 1p6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=J/4QRZtJ0XvrODyWLGtLcvVPl/7EoOAdDBNTbpXH4fk=; b=v93GNumAwyF2pW2kA8xMVHV4DqVYoLE1APd6kLPHq1LDubkrF6rMw8q9e2WsLXnIQR y0CazEJuGWfN5ivlDsc5wj90GZB2K7LT9v9ktJfYgtVJcOqj+irYJ+KcUsT0kAa4EZfC 1KJr0ZYaporjDSeyL1T+qbyRThkCZ37TxiXN8pb2EHDkykvaa7j52iGWOJJI6nq5D+y3 UWVibtNYimPWeTA1qYBZUEBS5oB5dHxZus2Wdiktx/m+4/yzbZURy8lS+56RlcB8xWlv jkkVh7kdQdu7A6AY1cQ6Ako9Yjr4ixJ/IYbfREEnATa1AkUEnjylvlZTA2UY8rrmUwrW 3r7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=RFjKKrFQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 16-v6si29951413pgp.175.2018.10.31.16.10.14; Wed, 31 Oct 2018 16:10:14 -0700 (PDT) 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=RFjKKrFQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730999AbeKAIKY (ORCPT + 32 others); Thu, 1 Nov 2018 04:10:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:32808 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730972AbeKAIKW (ORCPT ); Thu, 1 Nov 2018 04:10:22 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 128F020854; Wed, 31 Oct 2018 23:10:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541027410; bh=uWeThC8usxIRMmy2CrAE1eIn4apG7C3ambvWj+eOue4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RFjKKrFQRCi3LIunce2UzMIR08SOewM6C2UtBLOWi2Dsx07MAqwaGq7fgg5rEsKw+ VPB/XSNfV+A0gtaIfJ/6cZM3fyL3NnC5a5zcX4NGn+ApQQjEykDJK3yJ2i05fvmnAI SEATa8SyPi97q6OdwMtbVeCVqhO2+68I2EKVFGLA= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Will Deacon , Arnd Bergmann , Dominik Brodowski , "Eric W. Biederman" , Andrew Morton , Al Viro , Oleg Nesterov , Catalin Marinas , Sasha Levin Subject: [PATCH AUTOSEL 4.14 23/73] signal: Introduce COMPAT_SIGMINSTKSZ for use in compat_sys_sigaltstack Date: Wed, 31 Oct 2018 19:08:58 -0400 Message-Id: <20181031230948.29203-23-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181031230948.29203-1-sashal@kernel.org> References: <20181031230948.29203-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Will Deacon [ Upstream commit 22839869f21ab3850fbbac9b425ccc4c0023926f ] 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 Signed-off-by: Sasha Levin --- include/linux/compat.h | 3 +++ kernel/signal.c | 14 +++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) -- 2.17.1 diff --git a/include/linux/compat.h b/include/linux/compat.h index 3e838a828459..23909d12f729 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -68,6 +68,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) diff --git a/kernel/signal.c b/kernel/signal.c index 4439ba9dc5d9..b74acbec9876 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3215,7 +3215,8 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) } static int -do_sigaltstack (const stack_t *ss, stack_t *oss, unsigned long sp) +do_sigaltstack (const stack_t *ss, stack_t *oss, unsigned long sp, + size_t min_ss_size) { struct task_struct *t = current; @@ -3245,7 +3246,7 @@ do_sigaltstack (const stack_t *ss, stack_t *oss, unsigned long sp) ss_size = 0; ss_sp = NULL; } else { - if (unlikely(ss_size < MINSIGSTKSZ)) + if (unlikely(ss_size < min_ss_size)) return -ENOMEM; } @@ -3263,7 +3264,8 @@ SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) if (uss && copy_from_user(&new, uss, sizeof(stack_t))) return -EFAULT; err = do_sigaltstack(uss ? &new : NULL, uoss ? &old : NULL, - current_user_stack_pointer()); + current_user_stack_pointer(), + MINSIGSTKSZ); if (!err && uoss && copy_to_user(uoss, &old, sizeof(stack_t))) err = -EFAULT; return err; @@ -3274,7 +3276,8 @@ int restore_altstack(const stack_t __user *uss) stack_t new; if (copy_from_user(&new, uss, sizeof(stack_t))) return -EFAULT; - (void)do_sigaltstack(&new, NULL, current_user_stack_pointer()); + (void)do_sigaltstack(&new, NULL, current_user_stack_pointer(), + MINSIGSTKSZ); /* squash all but EFAULT for now */ return 0; } @@ -3309,7 +3312,8 @@ COMPAT_SYSCALL_DEFINE2(sigaltstack, uss.ss_size = uss32.ss_size; } ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, - compat_user_stack_pointer()); + compat_user_stack_pointer(), + COMPAT_MINSIGSTKSZ); if (ret >= 0 && uoss_ptr) { compat_stack_t old; memset(&old, 0, sizeof(old));