applied: https://github.com/crash-utility/crash/commit/72e2776caf1ca41dffcc8aba11c55c636565725b
On Wed, Nov 19, 2025 at 8:47 PM lijiang <[email protected]> wrote: > > On Wed, Nov 19, 2025 at 12:51 PM <[email protected]> > wrote: >> >> Date: Wed, 19 Nov 2025 17:06:32 +1300 >> From: Tao Liu <[email protected]> >> Subject: [Crash-utility] [PATCH] Revert "vmcoreinfo: read vmcoreinfo >> using 'vmcoreinfo_data' when unavailable in elf note" >> To: [email protected] >> Cc: Tao Liu <[email protected]> >> Message-ID: <[email protected]> >> Content-Type: text/plain; charset="US-ASCII"; x-default=true >> >> This patch will cause a regression on some x86_64 vmcores. >> >> $ crash -s vmcore vmlinux.gz >> WARNING: vmcoreinfo is empty, will read from symbols >> crash: cannot malloc vmcoreinfo buffer >> crash: /var/tmp/vmlinux.gz_fWV3kA and vmcore do not match! >> >> The root cause is, in main.c, is_kdump() calls is_netdump(), which will >> set pc->read_vmcoreinfo as vmcoreinfo_read_from_memory(), rather than >> original vmcoreinfo_read_string(). >> >> Later in machdep_init(PRE_SYMTAB), vmcoreinfo_read_from_memory() doesn't >> get "relocate" string, so fails for set kaslr flag, then fails for >> linux_banner detection: >> >> Thread 1 "crash" hit Breakpoint 2, verify_version (): >> 1096 if (!IS_KVADDR(linux_banner)) >> (gdb) p/x linux_banner >> $4 = 0xffffffff81e00100 >> >> crash> sym linux_banner >> ffffffff9aa00100 (R) linux_banner >> >> As we can see with the patch applied, linux_banner got a wrong address. >> So this patch currently is unsafe, and should be reverted before the fix. >> >> Signed-off-by: Tao Liu <[email protected]> >> --- >> >> Since it is too close to the new release date of crash utility, I don't >> have enough time for full root cause analysis and re-testing. So currently >> the best option is to revert it for now, and fix it in the next release then >> re-apply. >> > > Agree. Thanks for working on it, Tao. So: Acke > > Lianbo > >> --- >> defs.h | 1 - >> diskdump.c | 18 ------------------ >> kernel.c | 17 +++++------------ >> netdump.c | 19 ------------------- >> 4 files changed, 5 insertions(+), 50 deletions(-) >> >> diff --git a/defs.h b/defs.h >> index ab4aee8..ae6ea01 100644 >> --- a/defs.h >> +++ b/defs.h >> @@ -6225,7 +6225,6 @@ void dump_kernel_table(int); >> void dump_bt_info(struct bt_info *, char *where); >> void dump_log(int); >> void parse_kernel_version(char *); >> -char *vmcoreinfo_read_from_memory(const char *); >> >> #define LOG_LEVEL(v) ((v) & 0x07) >> #define SHOW_LOG_LEVEL (0x1) >> diff --git a/diskdump.c b/diskdump.c >> index de90755..ce3cbb7 100644 >> --- a/diskdump.c >> +++ b/diskdump.c >> @@ -1041,13 +1041,6 @@ pfn_to_pos(ulong pfn) >> return desc_pos; >> } >> >> -/** >> - * Check if vmcoreinfo in vmcore is missing/empty >> - */ >> -static bool is_diskdump_vmcoreinfo_empty(void) >> -{ >> - return (dd->sub_header_kdump->size_vmcoreinfo == 0); >> -} >> >> /* >> * Determine whether a file is a diskdump creation, and if TRUE, >> @@ -1095,17 +1088,6 @@ is_diskdump(char *file) >> >> pc->read_vmcoreinfo = vmcoreinfo_read_string; >> >> - /* >> - * vmcoreinfo can be empty in case of dump collected via virsh-dump >> - * >> - * check if vmcoreinfo is not available in vmcore, and try to read >> - * the vmcoreinfo from memory, using "vmcoreinfo_data" symbol >> - */ >> - if (is_diskdump_vmcoreinfo_empty()) { >> - error(WARNING, "vmcoreinfo is empty, will read from >> symbols\n"); >> - pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; >> - } >> - >> if ((pc->flags2 & GET_LOG) && KDUMP_CMPRS_VALID()) { >> pc->dfd = dd->dfd; >> pc->readmem = read_diskdump; >> diff --git a/kernel.c b/kernel.c >> index 13f3374..e077275 100644 >> --- a/kernel.c >> +++ b/kernel.c >> @@ -99,6 +99,7 @@ static ulong dump_audit_skb_queue(ulong); >> static ulong __dump_audit(char *); >> static void dump_audit(void); >> static void dump_printk_safe_seq_buf(int); >> +static char *vmcoreinfo_read_string(const char *); >> static void check_vmcoreinfo(void); >> static int is_pvops_xen(void); >> static int get_linux_banner_from_vmlinux(char *, size_t); >> @@ -11894,8 +11895,8 @@ dump_printk_safe_seq_buf(int msg_flags) >> * Returns a string (that has to be freed by the caller) that contains the >> * value for key or NULL if the key has not been found. >> */ >> -char * >> -vmcoreinfo_read_from_memory(const char *key) >> +static char * >> +vmcoreinfo_read_string(const char *key) >> { >> char *buf, *value_string, *p1, *p2; >> size_t value_length; >> @@ -11905,14 +11906,6 @@ vmcoreinfo_read_from_memory(const char *key) >> >> buf = value_string = NULL; >> >> - if (!(pc->flags & GDB_INIT)) { >> - /* >> - * GDB interface hasn't been initialised yet, so can't >> - * access vmcoreinfo_data >> - */ >> - return NULL; >> - } >> - >> switch (get_symbol_type("vmcoreinfo_data", NULL, NULL)) >> { >> case TYPE_CODE_PTR: >> @@ -11968,10 +11961,10 @@ check_vmcoreinfo(void) >> switch (get_symbol_type("vmcoreinfo_data", NULL, NULL)) >> { >> case TYPE_CODE_PTR: >> - pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; >> + pc->read_vmcoreinfo = vmcoreinfo_read_string; >> break; >> case TYPE_CODE_ARRAY: >> - pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; >> + pc->read_vmcoreinfo = vmcoreinfo_read_string; >> break; >> } >> } >> diff --git a/netdump.c b/netdump.c >> index 69100a9..c7ff009 100644 >> --- a/netdump.c >> +++ b/netdump.c >> @@ -111,14 +111,6 @@ map_cpus_to_prstatus(void) >> FREEBUF(nt_ptr); >> } >> >> -/** >> - * Check if vmcoreinfo in vmcore is missing/empty >> - */ >> -static bool is_netdump_vmcoreinfo_empty(void) >> -{ >> - return (nd->size_vmcoreinfo == 0); >> -} >> - >> /* >> * Determine whether a file is a netdump/diskdump/kdump creation, >> * and if TRUE, initialize the vmcore_data structure. >> @@ -472,17 +464,6 @@ is_netdump(char *file, ulong source_query) >> >> pc->read_vmcoreinfo = vmcoreinfo_read_string; >> >> - /* >> - * vmcoreinfo can be empty in case of dump collected via virsh-dump >> - * >> - * check if vmcoreinfo is not available in vmcore, and try to read >> - * the vmcoreinfo from memory, using "vmcoreinfo_data" symbol >> - */ >> - if (is_netdump_vmcoreinfo_empty()) { >> - error(WARNING, "vmcoreinfo is empty, will read from >> symbols\n"); >> - pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; >> - } >> - >> if ((source_query == KDUMP_LOCAL) && >> (pc->flags2 & GET_OSRELEASE)) >> kdump_get_osrelease(); >> -- >> 2.47.0 -- Crash-utility mailing list -- [email protected] To unsubscribe send an email to [email protected] https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki
