From: Mike Rapoport <rppt@kernel.org>
To: Jinjie Ruan <ruanjinjie@huawei.com>
Cc: catalin.marinas@arm.com, will@kernel.org, mark.rutland@arm.com,
chenhuacai@kernel.org, kernel@xen0n.name, maddy@linux.ibm.com,
mpe@ellerman.id.au, npiggin@gmail.com, chleroy@kernel.org,
ritesh.list@gmail.com, sshegde@linux.ibm.com, tglx@kernel.org,
mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com,
hpa@zytor.com, gregkh@linuxfoundation.org, rafael@kernel.org,
dakr@kernel.org, akpm@linux-foundation.org, baoquan.he@linux.dev,
pasha.tatashin@soleen.com, pratyush@kernel.org,
ruirui.yang@linux.dev, leitao@debian.org, yeoreum.yun@arm.com,
sourabhjain@linux.ibm.com, robh@kernel.org, coxu@redhat.com,
kees@kernel.org, tangyouling@kylinos.cn, liukexin@kylinos.cn,
zhangtianyang@loongson.cn, guodongtai@kylinos.cn,
maqianga@uniontech.com, chao.gao@intel.com, kai.huang@intel.com,
vishal.l.verma@intel.com, seanjc@google.com, piliu@redhat.com,
thuth@redhat.com, jbouron@amazon.com, me@linux.beauty,
mclapinski@google.com, graf@amazon.com, bgwin@google.com,
hbathini@linux.ibm.com, eric.devolder@oracle.com,
takahiro.akashi@linaro.org, james.morse@arm.com,
palmer@rivosinc.com, x86@kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
linuxppc-dev@lists.ozlabs.org, driver-core@lists.linux.dev,
kexec@lists.infradead.org
Subject: Re: [PATCH v6 09/14] x86/crash: Fix massive out-of-bounds write on 32-bit Highmem
Date: Wed, 21 Oct 2026 20:02:39 +0300 [thread overview]
Message-ID: <atjwL407guk-76DK@kernel.org> (raw)
In-Reply-To: <b729d819-39c9-42a1-8f9c-49019091b81f@huawei.com>
On Wed, Oct 21, 2026 at 04:28:31PM +0800, Jinjie Ruan wrote:
>
>
> 在 2026/10/20 16:09, Mike Rapoport 写道:
> > Hi Jinjie,
> >
> >> On 32-bit x86 systems with HIGHMEM, kmap_local_page() only maps a single
> >> 4KB page. However, the elfcorehdr segment can span several pages (up to
> >> hundreds of kilobytes).
> >>
> >> The original code blindly copies 'elfsz' bytes at once via
> >> memcpy_flushcache(), overwriting adjacent fixmap entries or critical
> >> virtual addresses.
> >>
> >> Fix this by copying the new elfcorehdr page by page.
> >
> > This is independed of other fixes and can be sent as a separate x86b fix.
>
> Yes
>
> >
> >> Cc: Thomas Gleixner <tglx@kernel.org>
> >> Cc: Ingo Molnar <mingo@redhat.com>
> >> Cc: Borislav Petkov <bp@alien8.de>
> >> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> >> Cc: "H. Peter Anvin" <hpa@zytor.com>
> >> Cc: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
> >> Cc: Vishal Verma <vishal.l.verma@intel.com>
> >> Cc: Baoquan He <baoquan.he@linux.dev>
> >> Cc: Chao Gao <chao.gao@intel.com>
> >> Cc: Sean Christopherson <seanjc@google.com>
> >> Cc: Eric DeVolder <eric.devolder@oracle.com>
> >> Cc: Hari Bathini <hbathini@linux.ibm.com>
> >> Cc: Andrew Morton <akpm@linux-foundation.org>
> >> Cc: Sourabh Jain <sourabhjain@linux.ibm.com>
> >> Cc: stable@vger.kernel.org
> >> Fixes: ea53ad9cf73b ("x86/crash: add x86 crash hotplug support")
> >> Link: https://sashiko.dev/#/patchset/20260907125404.922123-1-ruanjinjie%40huawei.com
> >> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
> >> ---
> >> arch/x86/kernel/crash.c | 26 +++++++++++++-------------
> >> 1 file changed, 13 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
> >> index e681ec9cf1dc8..3c9f4fbbe7ff0 100644
> >> --- a/arch/x86/kernel/crash.c
> >> +++ b/arch/x86/kernel/crash.c
> >> @@ -447,9 +447,10 @@ unsigned int arch_crash_get_elfcorehdr_size(void)
> >> */
> >> void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
> >> {
> >> - void *elfbuf = NULL, *old_elfcorehdr;
> >> unsigned long mem, memsz;
> >> unsigned long elfsz = 0;
> >> + void *elfbuf = NULL;
> >> + unsigned long done;
> >>
> >> /*
> >> * As crash_prepare_elf64_headers() has already described all
> >> @@ -484,21 +485,20 @@ void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
> >>
> >> /*
> >> * Copy new elfcorehdr over the old elfcorehdr at destination.
> >> - */
> >> - old_elfcorehdr = kmap_local_page(pfn_to_page(mem >> PAGE_SHIFT));
> >> - if (!old_elfcorehdr) {
> >> - pr_err("mapping elfcorehdr segment failed\n");
> >> - goto out;
> >> - }
> >> -
> >> - /*
> >> - * Temporarily invalidate the crash image while the
> >> - * elfcorehdr is updated.
> >> + * The segment is physically contiguous but can span several pages.
> >> + * On 32-bit Highmem architectures, kmap_local_page() maps only a
> >> + * single page at a time, so copy page by page.
> >> */
> >> xchg(&kexec_crash_image, NULL);
> >> - memcpy_flushcache(old_elfcorehdr, elfbuf, elfsz);
> >> + for (done = 0; done < elfsz; ) {
> >> + size_t chunk = min_t(size_t, PAGE_SIZE, elfsz - done);
> >> + void *dst = kmap_local_page(pfn_to_page((mem + done) >> PAGE_SHIFT));
> >> +
> >> + memcpy_flushcache(dst, elfbuf + done, chunk);
> >> + kunmap_local(dst);
> >> + done += chunk;
> >> + }
> >
> > HIGMEM is only enabled on 32-bit and there elfsz cannot be "massive"
> > because it is the size of the headers just built for the CPUs and RAM
> > ranges actually present, not the large memsz reserved for hotplug.
> > On x86_32 (NR_CPUS <= 64) that is a few KiB at most.
> >
> > Also, crashkernel is capped at CRASH_ADDR_HIGH_MAX = SZ_512M on X86_32,
> > which is below the default lowmem limit. For lowmem pages,
> > kmap_local_page() returns the contiguous direct-map address, so the old
>
> Hi Mike,
>
> x86 32-bit doesn't support memory hotplug, and NR_CPUS is capped at 8.
>
> config NR_CPUS_RANGE_END
> int
> depends on X86_32
> default 8 if SMP
> default 1 if !SMP
>
> According to the elf header size calculation in
> crash_prepare_elf64_headers():
>
> - nr_phdr = num_possible_cpus() + nr_mem_ranges + 2
> - sizeof(Elf64_Ehdr) = 64
> - sizeof(Elf64_Phdr) = 56
>
> so:
> elf_sz = 64 + (num_possible_cpus() + nr_mem_ranges + 2) * 56
>
> To exceed 4K:
>
> 64 + (num_possible_cpus() + nr_ranges + 2) * 56 > 4096
>
>
> So we'd need at least 60+ RAM ranges, which seems unlikely on real
> hardware without memory hotplug. I think this problem can't actually be
> triggered in practice, so we can safely drop this patch.
I think you are right and my LLM overestimated the amount of memory used :)
> > code was already fine.
> >
> > So the overflow needs the crash region to be in highmem, either through
> > crashkernel=size@offset above lowmem or through a large vmalloc=
> > setting, and an elfcorehdr larger than one page.
> >
> > It is still worth fixing, but please drop "massive" from the subject.
> >
> > The changelog should also mention the conditions when this could happen.
> >
>
> --
> Best regards,
> Jinjie
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2026-10-21 17:03 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-21 9:04 [PATCH v6 00/14] crash: Fix several bugs Jinjie Ruan
2026-09-21 9:04 ` [PATCH v6 01/14] kexec: Fix CMA segment address translation with non-zero text_offset Jinjie Ruan
2026-09-21 9:17 ` sashiko-bot
2026-10-20 8:09 ` Mike Rapoport
2026-10-20 8:34 ` Jinjie Ruan
2026-10-20 8:42 ` Jinjie Ruan
2026-09-21 9:04 ` [PATCH v6 02/14] kexec: Record allocated CMA pages to fix release size mismatch Jinjie Ruan
2026-09-21 9:14 ` sashiko-bot
2026-10-20 8:09 ` Mike Rapoport
2026-09-21 9:04 ` [PATCH v6 03/14] kexec: Extract kexec_free_segment_cma() from kimage_free_cma() Jinjie Ruan
2026-09-21 9:13 ` sashiko-bot
2026-09-21 9:13 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 04/14] arm64: kexec_file: Fix CMA page leaks in segment placement retry loops Jinjie Ruan
2026-09-21 9:18 ` sashiko-bot
2026-10-20 8:09 ` Mike Rapoport
2026-09-21 9:04 ` [PATCH v6 05/14] arm64: kexec_file: Fix elf_headers memory leak in retry loop Jinjie Ruan
2026-09-21 9:15 ` sashiko-bot
2026-10-10 20:00 ` Catalin Marinas
2026-09-21 9:04 ` [PATCH v6 06/14] LoongArch: kexec_file: Fix CMA page leaks in segment placement retry loops Jinjie Ruan
2026-09-21 9:13 ` sashiko-bot
2026-09-21 9:13 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 07/14] LoongArch: kexec_file: Fix elf_headers memory leak in retry loop Jinjie Ruan
2026-09-21 9:14 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 08/14] LoongArch: kexec_file: Fix a modified_cmdline leak Jinjie Ruan
2026-09-21 9:15 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 09/14] x86/crash: Fix massive out-of-bounds write on 32-bit Highmem Jinjie Ruan
2026-09-21 9:12 ` sashiko-bot
2026-09-21 9:12 ` sashiko-bot
2026-10-20 8:09 ` Mike Rapoport
2026-10-21 8:28 ` Jinjie Ruan
2026-10-21 17:02 ` Mike Rapoport [this message]
2026-09-21 9:04 ` [PATCH v6 10/14] crash: Extract crash_get_memory_ranges() helper Jinjie Ruan
2026-09-21 9:19 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 11/14] crash: Factor out crash_find_elfcorehdr() helper Jinjie Ruan
2026-09-21 9:17 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 12/14] crash: Normalize the kexec_load elfcorehdr at load time Jinjie Ruan
2026-09-21 9:19 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 13/14] driver core: Add device_hotplug_lock_assert_held() helper Jinjie Ruan
2026-09-21 9:18 ` sashiko-bot
2026-09-21 9:04 ` [PATCH v6 14/14] crash: Fix TOCTOU race in crash memory range collection Jinjie Ruan
2026-09-21 9:25 ` sashiko-bot
2026-09-21 9:25 ` sashiko-bot
2026-10-08 1:57 ` [PATCH v6 00/14] crash: Fix several bugs Jinjie Ruan
2026-10-08 3:26 ` Baoquan He
2026-10-08 6:42 ` Mike Rapoport
2026-10-20 8:09 ` Mike Rapoport
2026-10-20 8:53 ` Jinjie Ruan
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=atjwL407guk-76DK@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=baoquan.he@linux.dev \
--cc=bgwin@google.com \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=chao.gao@intel.com \
--cc=chenhuacai@kernel.org \
--cc=chleroy@kernel.org \
--cc=coxu@redhat.com \
--cc=dakr@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=driver-core@lists.linux.dev \
--cc=eric.devolder@oracle.com \
--cc=graf@amazon.com \
--cc=gregkh@linuxfoundation.org \
--cc=guodongtai@kylinos.cn \
--cc=hbathini@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=james.morse@arm.com \
--cc=jbouron@amazon.com \
--cc=kai.huang@intel.com \
--cc=kees@kernel.org \
--cc=kernel@xen0n.name \
--cc=kexec@lists.infradead.org \
--cc=leitao@debian.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=liukexin@kylinos.cn \
--cc=loongarch@lists.linux.dev \
--cc=maddy@linux.ibm.com \
--cc=maqianga@uniontech.com \
--cc=mark.rutland@arm.com \
--cc=mclapinski@google.com \
--cc=me@linux.beauty \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=npiggin@gmail.com \
--cc=palmer@rivosinc.com \
--cc=pasha.tatashin@soleen.com \
--cc=piliu@redhat.com \
--cc=pratyush@kernel.org \
--cc=rafael@kernel.org \
--cc=ritesh.list@gmail.com \
--cc=robh@kernel.org \
--cc=ruanjinjie@huawei.com \
--cc=ruirui.yang@linux.dev \
--cc=seanjc@google.com \
--cc=sourabhjain@linux.ibm.com \
--cc=sshegde@linux.ibm.com \
--cc=takahiro.akashi@linaro.org \
--cc=tangyouling@kylinos.cn \
--cc=tglx@kernel.org \
--cc=thuth@redhat.com \
--cc=vishal.l.verma@intel.com \
--cc=will@kernel.org \
--cc=x86@kernel.org \
--cc=yeoreum.yun@arm.com \
--cc=zhangtianyang@loongson.cn \
/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.