On Tue, Nov 26, 2024 at 11:46 AM Guanyou Chen <chenguanyou9...@gmail.com>
wrote:

> Hi  lianbo
>
> test case is non-elf-vmcore,  so all nt_prstatus_percpu invalid pointer.
>
>
Thanks for pointing out this. Can you help to try this one?

diff --git a/netdump.c b/netdump.c
index b4e2a5cb2037..b67bdad3c511 100644
--- a/netdump.c
+++ b/netdump.c
@@ -2768,7 +2768,8 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
  }
  }

- if ((cpu - skipped_count) >= nd->num_prstatus_notes &&
+ if (((cpu < 0 ) || (!nd->nt_prstatus_percpu[cpu]) ||
+ (cpu - skipped_count) >= nd->num_prstatus_notes) &&
      !machine_type("MIPS")) {
  error(INFO, "registers not collected for cpu %d\n", cpu);
  return;

Lianbo


> Thanks
> Guanyou.
>
> lijiang <liji...@redhat.com> 于2024年11月26日周二 11:27写道:
>
>> Hi, Guanyou
>> Thank you for the fix.
>> On Mon, Nov 4, 2024 at 4:13 PM <devel-requ...@lists.crash-utility.osci.io>
>> wrote:
>>
>>> Date: Fri, 1 Nov 2024 18:01:27 +0800
>>> From: Guanyou Chen <chenguanyou9...@gmail.com>
>>> Subject: [Crash-utility] [PATCH] bugfix command "help -r" segv fault
>>> To: Lianbo <liji...@redhat.com>, Tao Liu <l...@redhat.com>,
>>>         devel@lists.crash-utility.osci.io
>>> Message-ID:
>>>         <CAHS3RMU3nuiqW4z=
>>> qo9roufadruxcalhyjnxwmcugodb_+3...@mail.gmail.com>
>>> Content-Type: multipart/mixed; boundary="00000000000065fc530625d705b8"
>>>
>>> --00000000000065fc530625d705b8
>>> Content-Type: multipart/alternative;
>>> boundary="00000000000065fc530625d705b6"
>>>
>>> --00000000000065fc530625d705b6
>>> Content-Type: text/plain; charset="UTF-8"
>>>
>>> Hi Lianbo, Tao
>>>
>>> When the ELF Note does not contain CPU registers,
>>> attempting to retrieve online CPU registers will cause a crash.
>>>
>>> After:
>>> CPU 6:
>>> help: registers not collected for cpu 6
>>> ...
>>>
>>> Signed-off-by: Guanyou.Chen <chenguan...@xiaomi.com>
>>> ---
>>>  netdump.c | 16 ++++++++++++++++
>>>  1 file changed, 16 insertions(+)
>>>
>>> diff --git a/netdump.c b/netdump.c
>>> index 8ea5159..435793b 100644
>>> --- a/netdump.c
>>> +++ b/netdump.c
>>> @@ -2780,6 +2780,10 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
>>>
>>
>> I copied the code block here:
>> display_regs_from_elf_notes(int cpu, FILE *ofp)
>> {
>>         Elf32_Nhdr *note32;
>>         Elf64_Nhdr *note64;
>>         size_t len;
>>         char *user_regs;
>>         int c, skipped_count;
>>
>>         /*
>>          * Kdump NT_PRSTATUS notes are only related to online cpus,
>>          * so offline cpus should be skipped.
>>          */
>>         if (pc->flags2 & QEMU_MEM_DUMP_ELF)
>>                 skipped_count = 0;
>>         else {
>>                 for (c = skipped_count = 0; c < cpu; c++) {
>>                         if (check_offline_cpu(c))
>>                                 skipped_count++;
>>                 }
>>         }
>>
>>         if ((cpu - skipped_count) >= nd->num_prstatus_notes &&
>>              !machine_type("MIPS")) {
>>                 error(INFO, "registers not collected for cpu %d\n", cpu);
>>                 return;
>>         }
>> ...
>> Could you please point out why the above check does not work?
>>
>> BTW: I'm not sure if it can work for you, can you help to try this? Just
>> a guess.
>>
>>         if (((cpu < 0 ) || (!dd->nt_prstatus_percpu[cpu])
>>              || (cpu - skipped_count) >= nd->num_prstatus_notes) &&
>>              !machine_type("MIPS")) {
>>                 error(INFO, "registers not collected for cpu %d\n", cpu);
>>                 return;
>>         }
>>
>> Thanks
>> Lianbo
>>
>>
>>                 nd->nt_prstatus_percpu[cpu];
>>>         else
>>>                     note64 = (Elf64_Nhdr *)nd->nt_prstatus;
>>> +       if (!note64) {
>>> +           error(INFO, "registers not collected for cpu %d\n", cpu);
>>> +           return;
>>> +       }
>>>         len = sizeof(Elf64_Nhdr);
>>>         len = roundup(len + note64->n_namesz, 4);
>>>         len = roundup(len + note64->n_descsz, 4);
>>> @@ -2820,6 +2824,10 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
>>>                 nd->nt_prstatus_percpu[cpu];
>>>         else
>>>                     note32 = (Elf32_Nhdr *)nd->nt_prstatus;
>>> +       if (!note32) {
>>> +           error(INFO, "registers not collected for cpu %d\n", cpu);
>>> +           return;
>>> +       }
>>>         len = sizeof(Elf32_Nhdr);
>>>         len = roundup(len + note32->n_namesz, 4);
>>>         len = roundup(len + note32->n_descsz, 4);
>>> @@ -2857,6 +2865,10 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
>>>         else
>>>             note64 = (Elf64_Nhdr *)nd->nt_prstatus;
>>>
>>> +       if (!note64) {
>>> +           error(INFO, "registers not collected for cpu %d\n", cpu);
>>> +           return;
>>> +       }
>>>         prs = (struct ppc64_elf_prstatus *)
>>>             ((char *)note64 + sizeof(Elf64_Nhdr) + note64->n_namesz);
>>>         prs = (struct ppc64_elf_prstatus *)roundup((ulong)prs, 4);
>>> @@ -2903,6 +2915,10 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
>>>                 nd->nt_prstatus_percpu[cpu];
>>>         else
>>>                     note64 = (Elf64_Nhdr *)nd->nt_prstatus;
>>> +       if (!note64) {
>>> +           error(INFO, "registers not collected for cpu %d\n", cpu);
>>> +           return;
>>> +       }
>>>         len = sizeof(Elf64_Nhdr);
>>>         len = roundup(len + note64->n_namesz, 4);
>>>         len = roundup(len + note64->n_descsz, 4);
>>> --
>>> 2.34.1
>>>
>>> Guanyou.
>>> Thanks
>>>
>>
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to