linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: "haibinzhang (张海斌)" <haibinzhang@tencent.com>,
	hewenliang <hewenliang4@huawei.com>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Will Deacon" <will@kernel.org>,
	"Sasha Levin" <sashal@kernel.org>,
	mark.rutland@arm.com, linux-arm-kernel@lists.infradead.org
Subject: [PATCH AUTOSEL 5.19 09/58] arm64: fix oops in concurrently setting insn_emulation sysctls
Date: Sun,  7 Aug 2022 21:30:27 -0400	[thread overview]
Message-ID: <20220808013118.313965-9-sashal@kernel.org> (raw)
In-Reply-To: <20220808013118.313965-1-sashal@kernel.org>

From: haibinzhang (张海斌) <haibinzhang@tencent.com>

[ Upstream commit af483947d472eccb79e42059276c4deed76f99a6 ]

emulation_proc_handler() changes table->data for proc_dointvec_minmax
and can generate the following Oops if called concurrently with itself:

 | Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
 | Internal error: Oops: 96000006 [#1] SMP
 | Call trace:
 | update_insn_emulation_mode+0xc0/0x148
 | emulation_proc_handler+0x64/0xb8
 | proc_sys_call_handler+0x9c/0xf8
 | proc_sys_write+0x18/0x20
 | __vfs_write+0x20/0x48
 | vfs_write+0xe4/0x1d0
 | ksys_write+0x70/0xf8
 | __arm64_sys_write+0x20/0x28
 | el0_svc_common.constprop.0+0x7c/0x1c0
 | el0_svc_handler+0x2c/0xa0
 | el0_svc+0x8/0x200

To fix this issue, keep the table->data as &insn->current_mode and
use container_of() to retrieve the insn pointer. Another mutex is
used to protect against the current_mode update but not for retrieving
insn_emulation as table->data is no longer changing.

Co-developed-by: hewenliang <hewenliang4@huawei.com>
Signed-off-by: hewenliang <hewenliang4@huawei.com>
Signed-off-by: Haibin Zhang <haibinzhang@tencent.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20220128090324.2727688-1-hewenliang4@huawei.com
Link: https://lore.kernel.org/r/9A004C03-250B-46C5-BF39-782D7551B00E@tencent.com
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/arm64/kernel/armv8_deprecated.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c
index 6875a16b09d2..fb0e7c7b2e20 100644
--- a/arch/arm64/kernel/armv8_deprecated.c
+++ b/arch/arm64/kernel/armv8_deprecated.c
@@ -59,6 +59,7 @@ struct insn_emulation {
 static LIST_HEAD(insn_emulation);
 static int nr_insn_emulated __initdata;
 static DEFINE_RAW_SPINLOCK(insn_emulation_lock);
+static DEFINE_MUTEX(insn_emulation_mutex);
 
 static void register_emulation_hooks(struct insn_emulation_ops *ops)
 {
@@ -207,10 +208,10 @@ static int emulation_proc_handler(struct ctl_table *table, int write,
 				  loff_t *ppos)
 {
 	int ret = 0;
-	struct insn_emulation *insn = (struct insn_emulation *) table->data;
+	struct insn_emulation *insn = container_of(table->data, struct insn_emulation, current_mode);
 	enum insn_emulation_mode prev_mode = insn->current_mode;
 
-	table->data = &insn->current_mode;
+	mutex_lock(&insn_emulation_mutex);
 	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
 
 	if (ret || !write || prev_mode == insn->current_mode)
@@ -223,7 +224,7 @@ static int emulation_proc_handler(struct ctl_table *table, int write,
 		update_insn_emulation_mode(insn, INSN_UNDEF);
 	}
 ret:
-	table->data = insn;
+	mutex_unlock(&insn_emulation_mutex);
 	return ret;
 }
 
@@ -247,7 +248,7 @@ static void __init register_insn_emulation_sysctl(void)
 		sysctl->maxlen = sizeof(int);
 
 		sysctl->procname = insn->ops->name;
-		sysctl->data = insn;
+		sysctl->data = &insn->current_mode;
 		sysctl->extra1 = &insn->min;
 		sysctl->extra2 = &insn->max;
 		sysctl->proc_handler = emulation_proc_handler;
-- 
2.35.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2022-08-08  1:34 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20220808013118.313965-1-sashal@kernel.org>
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 03/58] arm64: kasan: do not instrument stacktrace.c Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 04/58] arm64: stacktrace: use non-atomic __set_bit Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 05/58] arm64: kernel: drop unnecessary PoC cache clean+invalidate Sasha Levin
2022-08-08  9:05   ` Ard Biesheuvel
2022-08-09 14:01     ` Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 06/58] arm64: mm: provide idmap pointer to cpu_replace_ttbr1() Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 07/58] arm64: kaslr: defer initialization to initcall where permitted Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 08/58] arm64: Do not forget syscall when starting a new thread Sasha Levin
2022-08-08  1:30 ` Sasha Levin [this message]
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 11/58] mm: kasan: Skip unpoisoning of user pages Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 13/58] arm64: kasan: Revert "arm64: mte: reset the page tag in page->flags" Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 14/58] arm64: errata: Remove AES hwcap for COMPAT tasks Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 23/58] ARM: dts: imx6ul: add missing properties for sram Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 24/58] ARM: dts: imx6ul: change operating-points to uint32-matrix Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 25/58] ARM: dts: imx6ul: fix keypad compatible Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 26/58] ARM: dts: imx6ul: fix csi node compatible Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 27/58] ARM: dts: imx6ul: fix lcdif " Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 28/58] ARM: dts: imx6ul: fix qspi " Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 29/58] ARM: dts: BCM5301X: Add DT for Meraki MR26 Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 30/58] ARM: dts: ux500: Fix Janice accelerometer mounting matrix Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 31/58] ARM: dts: ux500: Fix Codina " Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 32/58] ARM: dts: ux500: Fix Gavini " Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 35/58] ARM: OMAP2+: display: Fix refcount leak bug Sasha Levin
2022-08-08  1:30 ` [PATCH AUTOSEL 5.19 36/58] ARM: OMAP2+: pdata-quirks: " Sasha Levin
2022-08-08  1:31 ` [PATCH AUTOSEL 5.19 45/58] arm64: dts: allwinner: a64: orangepi-win: Fix LED node name Sasha Levin
2022-08-08  1:31 ` [PATCH AUTOSEL 5.19 46/58] ARM: shmobile: rcar-gen2: Increase refcount for new reference Sasha Levin
2022-08-08  1:31 ` [PATCH AUTOSEL 5.19 49/58] PM: EM: convert power field to micro-Watts precision and align drivers Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220808013118.313965-9-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=haibinzhang@tencent.com \
    --cc=hewenliang4@huawei.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=stable@vger.kernel.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).