libctf, open: fix opening CTF in binaries with no symtab
authorNick Alcock <nick.alcock@oracle.com>
Tue, 9 Jun 2020 09:27:57 +0000 (10:27 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 17:02:18 +0000 (18:02 +0100)
commitd50c08025d41b2efc70dbb384fc691f2d9632463
treef32f5a1ea26d5cedd9d159135ea48a16aa3f4d94
parent70447401740235d828c4b7b87e398eeae4801094
libctf, open: fix opening CTF in binaries with no symtab

This is a perfectly possible case, and half of ctf_bfdopen_ctfsect
handled it fine.  The other half hit a divide by zero or two before we
got that far, and had no code path to load the strtab from anywhere
in the absence of a symtab to point at it in any case.

So, as a fallback, if there is no symtab, try loading ".strtab"
explicitly by name, like we used to before we started looking for the
strtab the symtab used.

Of course, such a strtab is not kept hold of by BFD, so this means we
have to bring back the code to possibly explicitly free the strtab that
we read in.

libctf/
* ctf-impl.h (struct ctf_archive_internal) <ctfi_free_strsect>
New.
* ctf-open-bfd.c (ctf_bfdopen_ctfsect): Explicitly open a strtab
if the input has no symtab, rather than dividing by
zero. Arrange to free it later via ctfi_free_ctfsect.
* ctf-archive.c (ctf_new_archive_internal): Do not
ctfi_free_strsect by default.
(ctf_arc_close): Possibly free it here.
libctf/ChangeLog
libctf/ctf-archive.c
libctf/ctf-impl.h
libctf/ctf-open-bfd.c