Hi  lianbo

> Thanks for pointing out this. Can you help to try this one?

test pass.

Thanks
Guanyou

lijiang <liji...@redhat.com> 于2024年11月27日周三 10:16写道:

> 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