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>,
ardb@kernel.org, mark.rutland@arm.com,
linux-arm-kernel@lists.infradead.org
Subject: [PATCH AUTOSEL 5.10 03/29] arm64: fix oops in concurrently setting insn_emulation sysctls
Date: Sun, 7 Aug 2022 21:37:13 -0400 [thread overview]
Message-ID: <20220808013741.316026-3-sashal@kernel.org> (raw)
In-Reply-To: <20220808013741.316026-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 7364de008bab..91b8a8378ba3 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
next prev parent reply other threads:[~2022-08-08 1:53 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-08 1:37 [PATCH AUTOSEL 5.10 01/29] x86: Handle idle=nomwait cmdline properly for x86_idle Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 02/29] arm64: Do not forget syscall when starting a new thread Sasha Levin
2022-08-08 1:37 ` Sasha Levin [this message]
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 04/29] ext2: Add more validity checks for inode counts Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 05/29] genirq: Don't return error on missing optional irq_request_resources() Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 06/29] irqchip/mips-gic: Only register IPI domain when SMP is enabled Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 07/29] genirq: GENERIC_IRQ_IPI depends on SMP Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 08/29] irqchip/mips-gic: Check the return value of ioremap() in gic_of_init() Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 09/29] wait: Fix __wait_event_hrtimeout for RT/DL tasks Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 10/29] ARM: dts: imx6ul: add missing properties for sram Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 11/29] ARM: dts: imx6ul: change operating-points to uint32-matrix Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 12/29] ARM: dts: imx6ul: fix keypad compatible Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 13/29] ARM: dts: imx6ul: fix csi node compatible Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 14/29] ARM: dts: imx6ul: fix lcdif " Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 15/29] ARM: dts: imx6ul: fix qspi " Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 17/29] spi: synquacer: Add missing clk_disable_unprepare() Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 18/29] ARM: OMAP2+: display: Fix refcount leak bug Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 19/29] ACPI: EC: Remove duplicate ThinkPad X1 Carbon 6th entry from DMI quirks Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 20/29] ACPI: EC: Drop the EC_FLAGS_IGNORE_DSDT_GPE quirk Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 21/29] ACPI: PM: save NVS memory for Lenovo G40-45 Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 22/29] ACPI: LPSS: Fix missing check in register_device_clock() Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 23/29] arm64: dts: qcom: ipq8074: fix NAND node name Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 24/29] arm64: dts: allwinner: a64: orangepi-win: Fix LED " Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 25/29] ARM: shmobile: rcar-gen2: Increase refcount for new reference Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 26/29] firmware: tegra: Fix error check return value of debugfs_create_file() Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 27/29] hwmon: (sht15) Fix wrong assumptions in device remove callback Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 28/29] PM: hibernate: defer device probing when resuming from hibernation Sasha Levin
2022-08-08 1:37 ` [PATCH AUTOSEL 5.10 29/29] selinux: Add boundary check in put_entry() 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=20220808013741.316026-3-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=ardb@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