57 lines
2.2 KiB
Diff
57 lines
2.2 KiB
Diff
From 13e0a9327a42d78b0c0d0f672e02d8013187251a Mon Sep 17 00:00:00 2001
|
|
From: Chen Haixiang <chenhaixiang3@huawei.com>
|
|
Date: Mon, 21 Oct 2024 20:00:25 +0800
|
|
Subject: [PATCH] Before adding to usablemem_rgns, check if the memory range is
|
|
already included.
|
|
|
|
When kexec_iomem_for_each_line() reads from /proc/iomem,
|
|
concurrent modifications to /proc/iomem may lead to
|
|
usablemem_rgns recording duplicate Crash kernel segments.
|
|
This can result in the number of retrieved Crash kernel
|
|
segments exceeding CRASH_MAX_RESERVED_RANGES, triggering
|
|
a realloc of the crash_reserved_mem in usablemem_rgns,
|
|
which could crash the process. We should ensure that each
|
|
range added to usablemem_rgns is unique to prevent these issues.
|
|
|
|
Reviewed-by: Louhongxiang <louhongxiang@huawei.com>
|
|
Reviewed-by: wangbin <wangbin224@huawei.com>
|
|
Reviewed-by: yangyanchao <yangyanchao6@huawei.com>
|
|
Signed-off-by: chenhaixiang <chenhaixiang3@huawei.com>
|
|
Signed-off-by: Simon Horman <horms@kernel.org>
|
|
---
|
|
kexec/arch/arm64/crashdump-arm64.c | 16 ++++++++++++++--
|
|
1 file changed, 14 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c
|
|
index 3098315..f23b2bf 100644
|
|
--- a/kexec/arch/arm64/crashdump-arm64.c
|
|
+++ b/kexec/arch/arm64/crashdump-arm64.c
|
|
@@ -63,10 +63,22 @@ static int iomem_range_callback(void *UNUSED(data), int UNUSED(nr),
|
|
char *str, unsigned long long base,
|
|
unsigned long long length)
|
|
{
|
|
- if (strncmp(str, CRASH_KERNEL, strlen(CRASH_KERNEL)) == 0)
|
|
+ int i;
|
|
+
|
|
+ if (strncmp(str, CRASH_KERNEL, strlen(CRASH_KERNEL)) == 0) {
|
|
+ /*
|
|
+ * Checks whether the area exists in crash_reserved_mem.
|
|
+ */
|
|
+ for (i = 0; i < usablemem_rgns.max_size; i++) {
|
|
+ if (usablemem_rgns.ranges[i].start == base) {
|
|
+ fprintf(stderr, "Warning, the range already exists in usablemem_rgns, base=%lx, length=%lx\n",
|
|
+ base, length);
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
return mem_regions_alloc_and_add(&usablemem_rgns,
|
|
base, length, RANGE_RAM);
|
|
- else if (strncmp(str, SYSTEM_RAM, strlen(SYSTEM_RAM)) == 0)
|
|
+ } else if (strncmp(str, SYSTEM_RAM, strlen(SYSTEM_RAM)) == 0)
|
|
return mem_regions_alloc_and_add(&system_memory_rgns,
|
|
base, length, RANGE_RAM);
|
|
else if (strncmp(str, KERNEL_CODE, strlen(KERNEL_CODE)) == 0) {
|
|
--
|
|
2.43.0
|
|
|