From: Melon Liu <melon1335@163.com>
To: linux@armlinux.org.uk, lecopzer.chen@mediatek.com,
linus.walleij@linaro.org
Cc: linux-arm-kernel@lists.infradead.org, kasan-dev@googlegroups.com,
linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: [PATCH] ARM/mm: Fix stack recursion caused by KASAN
Date: Mon, 7 Oct 2024 13:23:40 +0800 [thread overview]
Message-ID: <ZwNwXF2MqPpHvzqW@liu> (raw)
When accessing the KASAN shadow area corresponding to the task stack
which is in vmalloc space, the stack recursion would occur if the area`s
page tables are unpopulated.
Calltrace:
...
__dabt_svc+0x4c/0x80
__asan_load4+0x30/0x88
do_translation_fault+0x2c/0x110
do_DataAbort+0x4c/0xec
__dabt_svc+0x4c/0x80
__asan_load4+0x30/0x88
do_translation_fault+0x2c/0x110
do_DataAbort+0x4c/0xec
__dabt_svc+0x4c/0x80
sched_setscheduler_nocheck+0x60/0x158
kthread+0xec/0x198
ret_from_fork+0x14/0x28
Fixes: 565cbaad83d ("ARM: 9202/1: kasan: support CONFIG_KASAN_VMALLOC")
Cc: <stable@vger.kernel.org>
Signed-off-by: Melon Liu <melon1335@163.org>
---
arch/arm/mm/ioremap.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
index 794cfea9f..f952b0b0f 100644
--- a/arch/arm/mm/ioremap.c
+++ b/arch/arm/mm/ioremap.c
@@ -115,16 +115,31 @@ int ioremap_page(unsigned long virt, unsigned long phys,
}
EXPORT_SYMBOL(ioremap_page);
+static inline void sync_pgds(struct mm_struct *mm, unsigned long start,
+ unsigned long end)
+{
+ end = ALIGN(end, PGDIR_SIZE);
+ memcpy(pgd_offset(mm, start), pgd_offset_k(start),
+ sizeof(pgd_t) * (pgd_index(end) - pgd_index(start)));
+}
+
+static inline void sync_vmalloc_pgds(struct mm_struct *mm)
+{
+ sync_pgds(mm, VMALLOC_START, VMALLOC_END);
+ if (IS_ENABLED(CONFIG_KASAN_VMALLOC))
+ sync_pgds(mm, (unsigned long)kasan_mem_to_shadow(
+ (void *)VMALLOC_START),
+ (unsigned long)kasan_mem_to_shadow(
+ (void *)VMALLOC_END));
+}
+
void __check_vmalloc_seq(struct mm_struct *mm)
{
int seq;
do {
seq = atomic_read(&init_mm.context.vmalloc_seq);
- memcpy(pgd_offset(mm, VMALLOC_START),
- pgd_offset_k(VMALLOC_START),
- sizeof(pgd_t) * (pgd_index(VMALLOC_END) -
- pgd_index(VMALLOC_START)));
+ sync_vmalloc_pgds(mm);
/*
* Use a store-release so that other CPUs that observe the
* counter's new value are guaranteed to see the results of the
--
2.43.0
next reply other threads:[~2024-10-07 5:25 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-07 5:23 Melon Liu [this message]
2024-10-07 10:25 ` [PATCH] ARM/mm: Fix stack recursion caused by KASAN Linus Walleij
2024-10-07 17:37 ` Melon Liu
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=ZwNwXF2MqPpHvzqW@liu \
--to=melon1335@163.com \
--cc=kasan-dev@googlegroups.com \
--cc=lecopzer.chen@mediatek.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=stable@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.