From patchwork Mon Jun 14 22:32:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 12320135 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=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, 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 6F63CC2B9F4 for ; Mon, 14 Jun 2021 22:35:00 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 2A82E611CE for ; Mon, 14 Jun 2021 22:35:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2A82E611CE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=xrvo9QrsIVEdkLqB8waRb7Qw59RVbHTJbg4EszZW/Nc=; b=BGR/Mb/WQOr9Fe zycrkMAB7FC0ESbsofTuO0Q5onnpl96tSzJZd+j/+69b88yzpulHTNwsjtDLThWJUsYyzg1GF3iv/ 7C52Asa2+MoFsC+59WSlTE84zUihfoKPC6YmHmkxFb52NKG9N3GDFddnDzegb2N2frp4N0rfUlTo9 Y9YsIwvozQsQbipI2VXOAuAclwMjO+fWeU1ykyJJZVFHkSwfNBuTdU+LxYc2vQ38PAn2jFwGEaFD3 5sfJiN4UEpde9zk28s+7rGMFQLIM6WCgqtsnKVQRZ6qY8FJr/jLsxS8LR9Ry9g+Do+7owS577pn5B W7/ELDotCuSAoK6i5EtA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv8y-00GPhs-Kd; Mon, 14 Jun 2021 22:33:20 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv8l-00GPe5-74 for linux-arm-kernel@lists.infradead.org; Mon, 14 Jun 2021 22:33:08 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5C5966124B; Mon, 14 Jun 2021 22:33:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623709986; bh=7WHZORg/W6I1gTPvY3Q95MjVz4fRSWdsaCUBHk8wyhY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dmuxymlZfh2Af6Ztfr2Fp3xSUntHy3UV4r0QDi5XOaZJiFjAy51aUAhTj3zq4vDEI UNYghIec1G9TGTEXSSqCQ1m+l5uLEmsZh2s6gIDt/2ayopzpToWPb2evwSQl79z8/C ljWtOUvzGSn+ovI9DHRi6IVe3ojJhxiZI54g2/Yf+WcBvGj7Cm/BQiamojRhPMQTkn 9U1/Y2qp8y+NOgzIOODvFW8pxY3SALyNhDVF9MohucqleRdyxMT8a4vIgWfSMIZHGW Pe62tMvaxqhiM/RV/vJUkANX4439/u3ruHKb1QJ9JFfzjBEx8FJCaevuiAgHuUsjQ3 6Z2lmzEKUNAIQ== From: Mark Brown To: Catalin Marinas , Will Deacon Cc: Szabolcs Nagy , Jeremy Linton , Dave Martin , "H . J . Lu" , Yu-cheng Yu , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, libc-alpha@sourceware.org, Mark Brown Subject: [PATCH v3 1/4] elf: Allow architectures to parse properties on the main executable Date: Mon, 14 Jun 2021 23:32:11 +0100 Message-Id: <20210614223214.39011-2-broonie@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210614223214.39011-1-broonie@kernel.org> References: <20210614223214.39011-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5964; h=from:subject; bh=7WHZORg/W6I1gTPvY3Q95MjVz4fRSWdsaCUBHk8wyhY=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBgx9jq2oNsGLcaZjVsA4F99PsgMw2i4A3A6jXdEM0c Xc0ZiPuJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYMfY6gAKCRAk1otyXVSH0EI/B/ 9zA+2LOdD5wyO3IW259lAj4GkijndIe+g3MvUSqjlZUIjkUbble0vK6y1jm3aozwlxY87mQC6feK5D 6iQJI/RVX6Wks8aoycieH8rRgqTl7iCQ588OhNQ1cP+AIUaRmZZzQ0/sHqj6Mtl/vrhJnVH8XV+5gd yurAGtuY9FV31VQt9kBs8ucK2qp8cWcYtI/tAvJU+H+KF7Nrr9LbBEI6r8DNcTEd5A3tNwIZI07VwP fvD4PBWJggXp5oNberirXf8vAQRpmZi2fqgi3INDDNZ5GcWKb3vz6OUOrFf0r9/C38EDkRqrkIIheY RwWQ7DmxDUZiE3wZnRuQ3wHWlHexmG X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210614_153307_330425_77778739 X-CRM114-Status: GOOD ( 19.84 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently the ELF code only attempts to parse properties on the image that will start execution, either the interpreter or for statically linked executables the main executable. The expectation is that any property handling for the main executable will be done by the interpreter. This is a bit inconsistent since we do map the executable and is causing problems for the arm64 BTI support when used in conjunction with systemd's use of seccomp to implement MemoryDenyWriteExecute which stops the dynamic linker adjusting the permissions of executable segments. Allow architectures to handle properties for both the dynamic linker and main executable, adjusting arch_parse_elf_properties() to have an is_interp flag as with arch_elf_adjust_prot() and calling it for both the main executable and any intepreter. Signed-off-by: Mark Brown --- arch/arm64/include/asm/elf.h | 3 ++- fs/binfmt_elf.c | 31 +++++++++++++++++++++++-------- include/linux/elf.h | 4 +++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 8d1c8dcb87fd..a488a1329b16 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -261,6 +261,7 @@ struct arch_elf_state { static inline int arch_parse_elf_property(u32 type, const void *data, size_t datasz, bool compat, + bool has_interp, bool is_interp, struct arch_elf_state *arch) { /* No known properties for AArch32 yet */ @@ -273,7 +274,7 @@ static inline int arch_parse_elf_property(u32 type, const void *data, if (datasz != sizeof(*p)) return -ENOEXEC; - if (system_supports_bti() && + if (system_supports_bti() && has_interp == is_interp && (*p & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) arch->flags |= ARM64_ELF_BTI; } diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 187b3f2b9202..c0d4f35c80f6 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -716,8 +716,9 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, */ static int parse_elf_property(const char *data, size_t *off, size_t datasz, - struct arch_elf_state *arch, - bool have_prev_type, u32 *prev_type) + struct arch_elf_state *arch, bool has_interp, + bool is_interp, bool have_prev_type, + u32 *prev_type) { size_t o, step; const struct gnu_property *pr; @@ -751,7 +752,8 @@ static int parse_elf_property(const char *data, size_t *off, size_t datasz, *prev_type = pr->pr_type; ret = arch_parse_elf_property(pr->pr_type, data + o, - pr->pr_datasz, ELF_COMPAT, arch); + pr->pr_datasz, ELF_COMPAT, + has_interp, is_interp, arch); if (ret) return ret; @@ -764,6 +766,7 @@ static int parse_elf_property(const char *data, size_t *off, size_t datasz, #define NOTE_NAME_SZ (sizeof(GNU_PROPERTY_TYPE_0_NAME)) static int parse_elf_properties(struct file *f, const struct elf_phdr *phdr, + bool has_interp, bool is_interp, struct arch_elf_state *arch) { union { @@ -813,7 +816,8 @@ static int parse_elf_properties(struct file *f, const struct elf_phdr *phdr, have_prev_type = false; do { ret = parse_elf_property(note.data, &off, datasz, arch, - have_prev_type, &prev_type); + has_interp, is_interp, have_prev_type, + &prev_type); have_prev_type = true; } while (!ret); @@ -828,6 +832,7 @@ static int load_elf_binary(struct linux_binprm *bprm) unsigned long error; struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL; struct elf_phdr *elf_property_phdata = NULL; + struct elf_phdr *interp_elf_property_phdata = NULL; unsigned long elf_bss, elf_brk; int bss_prot = 0; int retval, i; @@ -936,6 +941,10 @@ static int load_elf_binary(struct linux_binprm *bprm) executable_stack = EXSTACK_DISABLE_X; break; + case PT_GNU_PROPERTY: + elf_property_phdata = elf_ppnt; + break; + case PT_LOPROC ... PT_HIPROC: retval = arch_elf_pt_proc(elf_ex, elf_ppnt, bprm->file, false, @@ -963,12 +972,11 @@ static int load_elf_binary(struct linux_binprm *bprm) goto out_free_dentry; /* Pass PT_LOPROC..PT_HIPROC headers to arch code */ - elf_property_phdata = NULL; elf_ppnt = interp_elf_phdata; for (i = 0; i < interp_elf_ex->e_phnum; i++, elf_ppnt++) switch (elf_ppnt->p_type) { case PT_GNU_PROPERTY: - elf_property_phdata = elf_ppnt; + interp_elf_property_phdata = elf_ppnt; break; case PT_LOPROC ... PT_HIPROC: @@ -979,10 +987,17 @@ static int load_elf_binary(struct linux_binprm *bprm) goto out_free_dentry; break; } + + retval = parse_elf_properties(interpreter, + interp_elf_property_phdata, + true, true, &arch_state); + if (retval) + goto out_free_dentry; + } - retval = parse_elf_properties(interpreter ?: bprm->file, - elf_property_phdata, &arch_state); + retval = parse_elf_properties(bprm->file, elf_property_phdata, + interpreter != NULL, false, &arch_state); if (retval) goto out_free_dentry; diff --git a/include/linux/elf.h b/include/linux/elf.h index c9a46c4e183b..1c45ecf29147 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -88,13 +88,15 @@ struct arch_elf_state; #ifndef CONFIG_ARCH_USE_GNU_PROPERTY static inline int arch_parse_elf_property(u32 type, const void *data, size_t datasz, bool compat, + bool has_interp, bool is_interp, struct arch_elf_state *arch) { return 0; } #else extern int arch_parse_elf_property(u32 type, const void *data, size_t datasz, - bool compat, struct arch_elf_state *arch); + bool compat, bool has_interp, bool is_interp, + struct arch_elf_state *arch); #endif #ifdef CONFIG_ARCH_HAVE_ELF_PROT From patchwork Mon Jun 14 22:32:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 12320137 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=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, 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 8DD6FC2B9F4 for ; Mon, 14 Jun 2021 22:35:14 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 584FC611CE for ; Mon, 14 Jun 2021 22:35:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 584FC611CE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GaBBkALdi8yiXdqZ6fAmPErHqNvTv8s1H6snEOlFxNc=; b=owC6Rfg3rt+SpX ZOaNhGohEI4ubLlnf4nCzJ6WIVeJUtxRzyKd6dq3dKv1t3rSz+0TuliDRiXP72PPh0xcWFMUABFx7 51OUohlwQhac9Hrj+1Fjqyq+/FI3BJwxOuCejV7P/F2up4YZrsHmgfuwTIYdH98D4qn6WBAtNtRS7 A7rM9rvA3YSqhYxiRul5qpeqYPj4o82Z22MsySqW5H64ktNzE9ZRHDYsgReK9gPlCx2hAhkE7i8uI Z7aawx3v2hoaHYZd/gWUvU2WmEPcrZ90r4Bx7F9UjYVNCC21trMK3xUJbH3bpJ5dKlEMAbEk3A11b gqSUctFc+z+j9SYOpQvA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv9C-00GPkX-0w; Mon, 14 Jun 2021 22:33:34 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv8n-00GPez-W5 for linux-arm-kernel@lists.infradead.org; Mon, 14 Jun 2021 22:33:11 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 26C5061350; Mon, 14 Jun 2021 22:33:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623709989; bh=17k+MoyNqJzjgGdNm9vWTmTrX55pYmEUuacR3oROtGc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B96pXCAPu73HDcTLqF6DScu6eWnDuyXEGJ0+mKySi4KTsGB1UHyickhXQWBsGFH/7 PQFYCy0CuEQZM71ufwsxJ7e8RdUIYse0bDGSBwqkx5S2mJbOZyVq9QDW9pHJTRZBCq GQzt43v5Fj+UxG1sO95/eYcFGUCmMCh6+ju87sDuJN0/JUlYk3zRc4IpB47K5/gHsm o2XI+62U+DfvoQV0O2b9XoQR5Zl4Mmkj6WV80K/FP1DjmkBNQU/GZCMslG2szLX+pz QnbvQ2B8gv2mlx+xAq0ubxF3nTEBL3d2s/xM544/jadd+MOuq3rrpQEHxuHk5GP3os Jt6etQ8wES66w== From: Mark Brown To: Catalin Marinas , Will Deacon Cc: Szabolcs Nagy , Jeremy Linton , Dave Martin , "H . J . Lu" , Yu-cheng Yu , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, libc-alpha@sourceware.org, Mark Brown , Dave Martin Subject: [PATCH v3 2/4] arm64: Enable BTI for main executable as well as the interpreter Date: Mon, 14 Jun 2021 23:32:12 +0100 Message-Id: <20210614223214.39011-3-broonie@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210614223214.39011-1-broonie@kernel.org> References: <20210614223214.39011-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3373; h=from:subject; bh=17k+MoyNqJzjgGdNm9vWTmTrX55pYmEUuacR3oROtGc=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBgx9jrQwZiPSdRs/BCvcJegZDLgaOo3lU/tk5go+kw +KrIJRyJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYMfY6wAKCRAk1otyXVSH0Dt3B/ 9gbtsNgGoILSpsLB1V/Ykg9QDHZUdvpmJIO6J131l/HOYdFFyXRYlAvXPmiQTL2LYg3YNtuGplzd+h nefV7uBs+s2uO3w96j14BkRycwYPTSnpH2M2AYqURcsfBF6JPoXzBcAepB/WGG4wqICltrMFmTk1tn mvzRui//tTOa5O4gionTkSd26b87u2oJlqUNQOJZ7gGNXgZxCSLAprT5RP5PK6f27LEoYYXygcVK9S AcY8za6+3vdXyo5777gKo559Ih4+A0pmo/0Zy1WZUYKf0oAapPwPoXNHrfTaTyytLO486ee/dGMpGf MFekzKI7szXUVWMrSwWhPmwiYmKpz7 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210614_153310_094936_0F05E05F X-CRM114-Status: GOOD ( 17.52 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently for dynamically linked ELF executables we only enable BTI for the interpreter, expecting the interpreter to do this for the main executable. This is a bit inconsistent since we do map main executable and is causing issues with systemd's MemoryDenyWriteExecute feature which is implemented using a seccomp filter which prevents setting PROT_EXEC on already mapped memory and lacks the context to be able to detect that memory is already mapped with PROT_EXEC. Resolve this by checking the BTI property for the main executable and enabling BTI if it is present when doing the initial mapping. This does mean that we may get more code with BTI enabled if running on a system without BTI support in the dynamic linker, this is expected to be a safe configuration and testing seems to confirm that. It also reduces the flexibility userspace has to disable BTI but it is expected that for cases where there are problems which require BTI to be disabled it is more likely that it will need to be disabled on a system level. Signed-off-by: Mark Brown Reviewed-by: Dave Martin --- arch/arm64/include/asm/elf.h | 14 ++++++++++---- arch/arm64/kernel/process.c | 23 +++++++++++------------ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index a488a1329b16..9f86dbce2680 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -253,7 +253,8 @@ struct arch_elf_state { int flags; }; -#define ARM64_ELF_BTI (1 << 0) +#define ARM64_ELF_INTERP_BTI (1 << 0) +#define ARM64_ELF_EXEC_BTI (1 << 1) #define INIT_ARCH_ELF_STATE { \ .flags = 0, \ @@ -274,9 +275,14 @@ static inline int arch_parse_elf_property(u32 type, const void *data, if (datasz != sizeof(*p)) return -ENOEXEC; - if (system_supports_bti() && has_interp == is_interp && - (*p & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) - arch->flags |= ARM64_ELF_BTI; + if (system_supports_bti() && + (*p & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) { + if (is_interp) { + arch->flags |= ARM64_ELF_INTERP_BTI; + } else { + arch->flags |= ARM64_ELF_EXEC_BTI; + } + } } return 0; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index b4bb67f17a2c..21f1f0997c43 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -741,21 +741,20 @@ asmlinkage void __sched arm64_preempt_schedule_irq(void) } #ifdef CONFIG_BINFMT_ELF -int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state, - bool has_interp, bool is_interp) +static inline int arm64_elf_bti_flag(bool is_interp) { - /* - * For dynamically linked executables the interpreter is - * responsible for setting PROT_BTI on everything except - * itself. - */ - if (is_interp != has_interp) - return prot; + if (is_interp) + return ARM64_ELF_INTERP_BTI; + else + return ARM64_ELF_EXEC_BTI; +} - if (!(state->flags & ARM64_ELF_BTI)) - return prot; - if (prot & PROT_EXEC) +int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state, + bool has_interp, bool is_interp) +{ + if ((prot & PROT_EXEC) && + (state->flags & arm64_elf_bti_flag(is_interp))) prot |= PROT_BTI; return prot; From patchwork Mon Jun 14 22:32:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 12320139 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=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, 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 0636FC2B9F4 for ; Mon, 14 Jun 2021 22:35:24 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 C9BF56124B for ; Mon, 14 Jun 2021 22:35:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C9BF56124B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XdDL2IF71LGZOlYavAeq3FIJUG2ZXhLSKq/7OGZIYxU=; b=r2gDdTuq+OJebr 7Xt9NG1ojSH5N6bdufc/ttR1e4clKFiKbh51jrknZVvth+TtVFCM4VbEsUL4ZGmu6vlk4ctKH557M QXrIz5UUHj58hsC9SxLhvfgG2cSdkRCrHgs29beQX0ev6Z+1EXgLRvHsCCCx/JCpg0t7FkXZU4Sge Nq89cH2TKFw+HydZ8f7A+uDJ+w1YBgPjLYdLY+7OI399sPYCqhh4t2VITC5CvvAMi98TN+NOVKoS1 8EBKSsGls+VBQ8dhAfjZyeMqR6a89jdUaHHEUeY6eFIrlpMz3F5ipXMcQD70sqzN/1V8OX6gOfHrp ZyNjQsKUwz2GdJxpS9JA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv9N-00GPoS-Ty; Mon, 14 Jun 2021 22:33:46 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv8q-00GPfv-Qd for linux-arm-kernel@lists.infradead.org; Mon, 14 Jun 2021 22:33:14 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 02B52611CE; Mon, 14 Jun 2021 22:33:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623709992; bh=fCxAxBsrdCysAQR8O0YHtW9cXxwUrKw65hU1mQ0qWk0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MJA72SOIQ01jNlRC27EKVdasYKprLJOrD1tzu4aQ6r4GenG2ayV26NYRWeyKdkzKe DYHyYHRcXFQBZSNZ3bs18397h3Hy3pl9+Gt+3gYmxmGlRrwze+ou7PWEFrT9Qu2kLV QaMkl8lPvnsFxlizQtPtpuF9MnIVEp/Lp6GWNjnvND9x2ZmHmD74trzwRt4TMD9fb5 cHcosRyz8CIogWD/6CeGOyx6g33s77dCLMfHvc/B5DI+TgfgZZ7rrwkjj2bHVWUAik 2ZHsx7zZ9RyS60tBHW68HKOWxelcmMNHs/RdvNrWvlxUkPjVXCin7UDtcWds1wDV34 4utHSLiqHKukg== From: Mark Brown To: Catalin Marinas , Will Deacon Cc: Szabolcs Nagy , Jeremy Linton , Dave Martin , "H . J . Lu" , Yu-cheng Yu , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, libc-alpha@sourceware.org, Mark Brown Subject: [PATCH v3 3/4] elf: Remove has_interp property from arch_adjust_elf_prot() Date: Mon, 14 Jun 2021 23:32:13 +0100 Message-Id: <20210614223214.39011-4-broonie@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210614223214.39011-1-broonie@kernel.org> References: <20210614223214.39011-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2151; h=from:subject; bh=fCxAxBsrdCysAQR8O0YHtW9cXxwUrKw65hU1mQ0qWk0=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBgx9jscT/tjOsyDA4fqAk63t8+zhdRqo/okAQGtBab 6GkwKRSJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYMfY7AAKCRAk1otyXVSH0Fv8B/ 9n4MxOkwE08+s1KuYDbXW8HmGkcSrRsnbokMnx4O6yqCfYunlNP76yiYDisbWcziywvhtxfnNfd3pG MYFI38kzyTwwFnUI+avkO91uGTO1ywrvkZ67dJ+h+cfIK/FJDWy5v3ZGvmeAIZPwqUgtZ16HDp75PD ckdcB5aWS9v8nFz5mMJYUPBcpX7ZqmkNSqJlwoJ3qc4gx4jqYMKuh6PDucY6ZsCa7Qnu/8Qfig+4jL DYu83xz4morL6efeTNRbXvgPcD+gECGDAck4Ty62ZNxVeqK7yKCoilNmzgWQh3cKmFaW/tE9e3ED08 05qalJGq9fFljHagQoBM6gIFC4qGSB X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210614_153312_931676_95CB94F0 X-CRM114-Status: GOOD ( 11.64 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Since we have added an is_interp flag to arch_parse_elf_property() we can drop the has_interp flag from arch_elf_adjust_prot(), the only user was the arm64 code which no longer needs it and any future users will be able to use arch_parse_elf_properties() to determine if an interpreter is in use. Signed-off-by: Mark Brown --- arch/arm64/kernel/process.c | 2 +- fs/binfmt_elf.c | 2 +- include/linux/elf.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 21f1f0997c43..2b952593534a 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -751,7 +751,7 @@ static inline int arm64_elf_bti_flag(bool is_interp) int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state, - bool has_interp, bool is_interp) + bool is_interp) { if ((prot & PROT_EXEC) && (state->flags & arm64_elf_bti_flag(is_interp))) diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index c0d4f35c80f6..ffe38d54308b 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -580,7 +580,7 @@ static inline int make_prot(u32 p_flags, struct arch_elf_state *arch_state, if (p_flags & PF_X) prot |= PROT_EXEC; - return arch_elf_adjust_prot(prot, arch_state, has_interp, is_interp); + return arch_elf_adjust_prot(prot, arch_state, is_interp); } /* This is much more generalized than the library routine read function, diff --git a/include/linux/elf.h b/include/linux/elf.h index 1c45ecf29147..d8392531899d 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -101,11 +101,11 @@ extern int arch_parse_elf_property(u32 type, const void *data, size_t datasz, #ifdef CONFIG_ARCH_HAVE_ELF_PROT int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state, - bool has_interp, bool is_interp); + bool is_interp); #else static inline int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state, - bool has_interp, bool is_interp) + bool is_interp) { return prot; } From patchwork Mon Jun 14 22:32:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 12320141 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=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 73A9EC2B9F4 for ; Mon, 14 Jun 2021 22:35:43 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 382236124B for ; Mon, 14 Jun 2021 22:35:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 382236124B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=UHhZKWlD2fB6BtRf+c9P25oKANgKL4MwxxAs9BdN7VI=; b=4nbQTDMf2qNVJa IaLuA6bT9OoJ6xQ96WInJcu0fzSdcq0UE7SOEcC93oJKTScGrUV8LcWxDSGIvlWlvSUUxemW2K14f P7AlVwMHVzM5OcSiwDKV83Sz9Zu4eUGRjuETFeEVEDo1YWZ8kq0Od+zzhUnG6lycTEj3Ux3ZWuga6 +Ge6nFSK5zHOu4JJqnWQNChWDJXDejeZRgvxJSOhZN+aaWLBIAPLDvn8T92XOQtYukaTSpMt933RH nDXrxBWcE6L6UxJW5vdSleem7OdvgnyjiYvRUmGTw+DHVqnVzYo31Pvx9BA0f1gcu/9N2J3lxkhJ8 EYEMbvW99FlIhgnL3X6g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv9d-00GPun-Tv; Mon, 14 Jun 2021 22:34:02 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lsv8t-00GPgl-Jz for linux-arm-kernel@lists.infradead.org; Mon, 14 Jun 2021 22:33:17 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id B398461350; Mon, 14 Jun 2021 22:33:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623709995; bh=dADxCcnOfO3ZUnZ9a2fEumgqIOKICC14vf9CSy6vgv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qGypQ71abbJTgI5upU7DehXGtS18qXrDm8e3xLXfvJCuSXYn9ycfqT3/IccI/P/iN yK/DVQBPar7K+e9A1ymKzj/WRcyQ9irrZK5K0F/fYH5UR2MVnfzBcx8vwDv+PUs+a+ Z25DdgtJnGDpnGM6d5EKYMB4pQ+dIhWn9fuTSCNBgxWgfKWHJLyMXAQVsudUqK8Rr5 82eLcyDmAkbmAfnPI/0SORZGv83zLoWXZingxp7eoyaTazvME6LRnZB3wydeSKrfDp BpvNP1Dg3WdQGKAD15DBDjz9+z4u0OK11NC4YVZmtxEuLFhYaPbRrNVDitdXtkmXxp zeS2HQ0/ytKDA== From: Mark Brown To: Catalin Marinas , Will Deacon Cc: Szabolcs Nagy , Jeremy Linton , Dave Martin , "H . J . Lu" , Yu-cheng Yu , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, libc-alpha@sourceware.org, Mark Brown Subject: [PATCH v3 4/4] elf: Remove has_interp property from arch_parse_elf_property() Date: Mon, 14 Jun 2021 23:32:14 +0100 Message-Id: <20210614223214.39011-5-broonie@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210614223214.39011-1-broonie@kernel.org> References: <20210614223214.39011-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2046; h=from:subject; bh=dADxCcnOfO3ZUnZ9a2fEumgqIOKICC14vf9CSy6vgv0=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBgx9jthwgmlfRA1jM91GkX7mG7mC714J/VsA8WtqyN FwHJzzqJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYMfY7QAKCRAk1otyXVSH0Px6B/ 9ZQmIoNj/Fsbx5yBcfBfa7aW1jNFB1wAIMpAythc7L3lyflO+/Uo83KH38OzRCi72aZPXNs89O8hk/ z5KFmFFHmgUhxh++V1Uv6+JML3VbsAk4QeaW6LNwE1JlfMB6WPk4lKdlqRW1V0jo8Wl5zL2CbzsKlq skmLKgudOy6QdcUTdZ62XOROXUIDtYl9HIBqx0295UpAcHTYH7XnrUWz571gJH1RozGZPoz0/gQcRJ rQvOGo3ncDf6amtTmrO4k7JyO0rtQ5op4tXC6y6fyJ9rr8se4lVLKkDWs1rPvewsDj42iVEY86NJoT cj0wVnj4CIRpZ8Mn2W4lcJTDzZl4Nb X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210614_153315_729054_C9955921 X-CRM114-Status: GOOD ( 11.67 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Since all current users of arch_parse_elf_property() are able to treat the interpreter and main executable orthogonaly the has_interp argument is now redundant so remove it. Signed-off-by: Mark Brown --- arch/arm64/include/asm/elf.h | 2 +- fs/binfmt_elf.c | 2 +- include/linux/elf.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 9f86dbce2680..a6e9032b951a 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -262,7 +262,7 @@ struct arch_elf_state { static inline int arch_parse_elf_property(u32 type, const void *data, size_t datasz, bool compat, - bool has_interp, bool is_interp, + bool is_interp, struct arch_elf_state *arch) { /* No known properties for AArch32 yet */ diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index ffe38d54308b..5509ae63c2e1 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -753,7 +753,7 @@ static int parse_elf_property(const char *data, size_t *off, size_t datasz, ret = arch_parse_elf_property(pr->pr_type, data + o, pr->pr_datasz, ELF_COMPAT, - has_interp, is_interp, arch); + is_interp, arch); if (ret) return ret; diff --git a/include/linux/elf.h b/include/linux/elf.h index d8392531899d..cdb080d4b34a 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -88,14 +88,14 @@ struct arch_elf_state; #ifndef CONFIG_ARCH_USE_GNU_PROPERTY static inline int arch_parse_elf_property(u32 type, const void *data, size_t datasz, bool compat, - bool has_interp, bool is_interp, + bool is_interp, struct arch_elf_state *arch) { return 0; } #else extern int arch_parse_elf_property(u32 type, const void *data, size_t datasz, - bool compat, bool has_interp, bool is_interp, + bool compat, bool is_interp, struct arch_elf_state *arch); #endif