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@xxxxxxxxxx> Reviewed-by: wangbin <wangbin224@xxxxxxxxxx> Reviewed-by: yangyanchao <yangyanchao6@xxxxxxxxxx> Signed-off-by: chenhaixiang <chenhaixiang3@xxxxxxxxxx> --- 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@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec