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

Reply via email to