[Crash-utility] Re: [PATCH] bugfix command "help -r" segv fault

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Tao

Thanks for your explanation. 

Test env:
WARNING: cpu 0: cannot find NT_PRSTATUS note    
WARNING: cpu 1: cannot find NT_PRSTATUS note
WARNING: cpu 2: cannot find NT_PRSTATUS note
WARNING: cpu 3: cannot find NT_PRSTATUS note
WARNING: cpu 4: cannot find NT_PRSTATUS note
WARNING: cpu 5: cannot find NT_PRSTATUS note
WARNING: cpu 6: cannot find NT_PRSTATUS note
WARNING: cpu 7: cannot find NT_PRSTATUS note
      KERNEL: vmlinux  [TAINTED]
   DUMPFILES: /var/tmp/ramdump_elf_RabECD [temporary ELF header]
              DDRCS0_0.BIN
              DDRCS1_0.BIN
              DDRCS1_1.BIN
              DDRCS2_0.BIN
              DDRCS2_1.BIN
              DDRCS2_2.BIN
        CPUS: 8

The non-elf-vmcore is composed of multiple DDR memory files.

Thanks
Guanyou

Tao Liu <ltao@xxxxxxxxxx> 于2024年12月11日周三 07:12写道:
Hi Guanyou,

On Tue, Dec 10, 2024 at 7:35 PM lijiang <lijiang@xxxxxxxxxx> wrote:
>
> On Wed, Nov 27, 2024 at 11:09 AM Guanyou Chen <chenguanyou9338@xxxxxxxxx> wrote:
>>
>> Hi  lianbo
>>
>> > Thanks for pointing out this. Can you help to try this one?
>>
>> test pass.
>>
>
> Thank you for the confirmation, Guanyou.
>
> Lets pick up this one. so: Ack(with this correction)
>
> Thanks
> Lianbo
>
>>
>> Thanks
>> Guanyou
>>
>> lijiang <lijiang@xxxxxxxxxx> 于2024年11月27日周三 10:16写道:
>>>
>>> On Tue, Nov 26, 2024 at 11:46 AM Guanyou Chen <chenguanyou9338@xxxxxxxxx> wrote:
>>>>
>>>> Hi  lianbo
>>>>
>>>> test case is non-elf-vmcore,  so all nt_prstatus_percpu invalid pointer.

I have a question, if your test case is non-elf-vmcore, then why did
the code execution reach the function "display_regs_from_elf_notes()"
here? It shouldn't pass the is_netdump() check for ELF header in the
first place, am I right?

How did you generate the non-elf-vmcore? If you generate it by some
special method(those not generated by makedumpfile), please also point
it out in your commit message at first, so we can know it is a special
case.

In addition, we are lack of none-standard vmcores(none makedumpfile
generated) for testing, and I know in the arm world there are
different methods for getting the kernel memory dumping, which by the
way, are not our expertise. So please try to provide as much info as
possible to help us understand your test case/environment in your
commit message next time.

Thanks,
Tao Liu


>>>>
>>>
>>> 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 <lijiang@xxxxxxxxxx> 于2024年11月26日周二 11:27写道:
>>>>>
>>>>> Hi, Guanyou
>>>>> Thank you for the fix.
>>>>> On Mon, Nov 4, 2024 at 4:13 PM <devel-request@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
>>>>>>
>>>>>> Date: Fri, 1 Nov 2024 18:01:27 +0800
>>>>>> From: Guanyou Chen <chenguanyou9338@xxxxxxxxx>
>>>>>> Subject: [PATCH] bugfix command "help -r" segv fault
>>>>>> To: Lianbo <lijiang@xxxxxxxxxx>, Tao Liu <ltao@xxxxxxxxxx>,
>>>>>>         devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>>>> Message-ID:
>>>>>>         <CAHS3RMU3nuiqW4z=Qo9RoufADrUxcaLhyjnxwMCuGODB_+37yQ@xxxxxxxxxxxxxx>
>>>>>> 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 <chenguanyou@xxxxxxxxxx>
>>>>>> ---
>>>>>>  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@xxxxxxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux