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 <louhongxi...@huawei.com>
Reviewed-by: wangbin <wangbin...@huawei.com>
Reviewed-by: yangyanchao <yangyanch...@huawei.com>
Signed-off-by: chenhaixiang <chenhaixia...@huawei.com>
---
 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.41.0


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to