From mboxrd@z Thu Jan 1 00:00:00 1970 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=-14.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham 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 17DBDC433ED for ; Wed, 5 May 2021 17:32:23 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 BEDB661004 for ; Wed, 5 May 2021 17:32:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BEDB661004 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.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=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=POk8wgWCr9H+kqeam6ueXOAhcCuauHRx7xhzRkCWsuw=; b=lY7yLW7z3OJZQ09FzCvAGQOH0 D3Alrd6pNVPJ+dt0pKz/p97QwSQGoU6Xv40p1UFo4H8K8JL/9A3goC95xaSae3kyJyPINyQilHYE+ 9eTQeRd/wcBL5llt6TUxbnsbid6z92VnNIwrIQdy4RGN3Lw4vBT3ID9xGQLCCIW9P5OF3OyfxMUdh ETUdDbDP0uKonRx8anjB08NVOfDh+ny8oLFJGJTeNGI6aUiZy+rRfK1AYSgH8U8ZybpFaif9Od/44 fXihVsW1gkEesRRp8oAJM6kfX2hOWiQiN8v8KfaPMM2mgs9XABelGImrDUQ7e7nNMv0C3m44M64E3 Nbs2qPV/A==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1leLM1-001ueS-9c; Wed, 05 May 2021 17:30:33 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1leLLz-001ueH-GW for linux-arm-kernel@desiato.infradead.org; Wed, 05 May 2021 17:30:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=In-Reply-To:Content-Type:MIME-Version :References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=aqiKpvrbIKEUFcPaEHpWlX7/EqGVA+x2KDHDrAUhtew=; b=crBtXPDjcGPY2V1QS9Ow6Ou98g TofwVI/EeRjXAWxbY1DIceBzeEXILkVnDH1Az1oRbwikMplRW4fJOe3w+LhXifGtyCGIYF/ZGp1U0 4CZD02HXDRkfLvcwoSRfLfAFraRdzOGGID5PzoPcoKPYptYpryaTXVZr/srbLW/PKGYYNXsXhZ1q/ S0grZAZYOzRPK0uzDtrmjL9dA4A6ZcCZvZmoH6Ffalq9mTw+EAvj088eV94i+Fb+nwnFzObMzdwkT S1082vjWs+FEwgs561awUCzpjxuZ+MpKLDa1/7ftvEwRqtpYdfH8xT8KOGnMA7AWPnvgc3zoFS58G P7fwZRjg==; Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1leLLu-0054VJ-Hl for linux-arm-kernel@lists.infradead.org; Wed, 05 May 2021 17:30:28 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E25811FB; Wed, 5 May 2021 10:30:19 -0700 (PDT) Received: from C02TD0UTHF1T.local (unknown [10.57.28.242]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id BF0D03F70D; Wed, 5 May 2021 10:30:17 -0700 (PDT) Date: Wed, 5 May 2021 18:30:14 +0100 From: Mark Rutland To: He Zhe Cc: oleg@redhat.com, catalin.marinas@arm.com, will@kernel.org, linux-arm-kernel@lists.infradead.org, paul@paul-moore.com, eparis@redhat.com, linux-audit@redhat.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 2/3] arm64: syscall.h: Add sign extension handling in syscall_get_return_value for compat Message-ID: <20210505173014.GE5605@C02TD0UTHF1T.local> References: <20210423103533.30121-1-zhe.he@windriver.com> <20210423103533.30121-2-zhe.he@windriver.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20210423103533.30121-2-zhe.he@windriver.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210505_103026_660308_35400FC5 X-CRM114-Status: GOOD ( 24.45 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, On Fri, Apr 23, 2021 at 06:35:32PM +0800, He Zhe wrote: > Add sign extension handling in syscall_get_return_value so that it can > handle 32-bit compatible case and can be used by for example audit, just > like what syscall_get_error does. > > Suggested-by: Mark Rutland > Signed-off-by: He Zhe > --- > v1 to v2: Improve error code check suggested by Mark > > arch/arm64/include/asm/syscall.h | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h > index cfc0672013f6..c3b5fca82ff4 100644 > --- a/arch/arm64/include/asm/syscall.h > +++ b/arch/arm64/include/asm/syscall.h > @@ -44,7 +44,20 @@ static inline long syscall_get_error(struct task_struct *task, > static inline long syscall_get_return_value(struct task_struct *task, > struct pt_regs *regs) > { > - return regs->regs[0]; > + long val = regs->regs[0]; > + long error = val; > + > + if (compat_user_mode(regs)) > + error = sign_extend64(error, 31); > + > + /* > + * Return codes with bit 31 set may or may not be an error code. > + * For example, mmap may return a legal 32 bit address with bit 31 set > + * for 32 bit thread, in which case the untouched val should be > + * returned. Otherwise, the sign-extended error should be returned if > + * it still falls in error number range. > + */ > + return IS_ERR_VALUE(error) ? error : val; I'm afraid I have misled you here. I wrote up a test that uses PTRACE_GET_SYSCALL_INFO, and I found that on a 32-bit arm (v5.12) kernel, *all* syscall return values get sign-extended after all. For example, if (on a 32-bit kernel) I use MAP_FIXED to mmap() at address 0x8bad0000, the return value reported in ptrace_syscall_info::exit::rval is 0xffffffff8bad0000. So for that we shoudn't have the IS_ERR_VALUE() check after all, but I'm not currently sure whether there are other cases where 32-bit arm wouldn't sign-extend, and I think we'll need to dig into this some more. Thanks, Mark. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel