Hi Aleksei, On Mon, 2023-11-20 at 17:44 +0000, Aleksei Vetrov wrote: > When archive is processed in process_archive (libdwfl/offline.c), it > creates an Elf object for each archive member. Then in > process_archive_member it calls process_file to create a Dwfl_Module > through __libdwfl_report_elf. > > The ownership of the Elf object is expected to be: > > * either transfered to the Dwfl_Module, if __libdwfl_report_elf returns > not NULL; > > * or handled at the end of process_archive_member by calling elf_end. > > Moreover, Elf object is expected to be alive, if __libdwfl_report_elf > returns not NULL, because at the end of process_archive_member it > advances to the next member through the elf_next call. > > The problem happens when __libdwfl_report_elf encounters Elf with the > same name and content as it seen before. In that case dwfl_report_module > will reuse existing Dwfl_Module object. This leads to a codepath that > calls elf_end on the Elf object, while returning not NULL, breaking the > elf_next call to the next member. > > The fix is to destroy m->main.elf instead and put the new Elf object in > the already existing Dwfl_Module. > > * libdwfl/dwfl_report_elf.c (__libdwfl_report_elf): Replace Elf in > the Dwfl_Module in case of duplicate modules to prolong its > lifetime for subsequent processing.
Thanks, pushed. Mark