aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-10-28 15:42:56 +0000
committerNick Clifton <nickc@redhat.com>2014-10-28 15:42:56 +0000
commit5a4b0ccc20ba30caef53b01bee2c0aaa5b855339 (patch)
tree825a7b0ff2890362594ef66925c491755d59b65a /bfd/elf.c
parent1df4399f27f8ee817d8eb4c73bba42bb65844303 (diff)
downloadgdb-5a4b0ccc20ba30caef53b01bee2c0aaa5b855339.zip
gdb-5a4b0ccc20ba30caef53b01bee2c0aaa5b855339.tar.gz
gdb-5a4b0ccc20ba30caef53b01bee2c0aaa5b855339.tar.bz2
More fixes for corrupt binaries crashing the binutils.
PR binutils/17512 * elf.c (bfd_section_from_shdr): Allocate and free the recursion detection table on a per-bfd basis. * peXXigen.c (pe_print_edata): Handle binaries with a truncated export table.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 949221f..b5fc84b 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1580,6 +1580,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
const char *name;
bfd_boolean ret = TRUE;
static bfd_boolean * sections_being_created = NULL;
+ static bfd * sections_being_created_abfd = NULL;
static unsigned int nesting = 0;
if (shindex >= elf_numsections (abfd))
@@ -1592,13 +1593,19 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
loop. Detect this here, by refusing to load a section that we are
already in the process of loading. We only trigger this test if
we have nested at least three sections deep as normal ELF binaries
- can expect to recurse at least once. */
-
+ can expect to recurse at least once.
+
+ FIXME: It would be better if this array was attached to the bfd,
+ rather than being held in a static pointer. */
+
+ if (sections_being_created_abfd != abfd)
+ sections_being_created = NULL;
if (sections_being_created == NULL)
{
/* FIXME: It would be more efficient to attach this array to the bfd somehow. */
sections_being_created = (bfd_boolean *)
bfd_zalloc (abfd, elf_numsections (abfd) * sizeof (bfd_boolean));
+ sections_being_created_abfd = abfd;
}
if (sections_being_created [shindex])
{
@@ -2102,7 +2109,10 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
if (sections_being_created)
sections_being_created [shindex] = FALSE;
if (-- nesting == 0)
- sections_being_created = NULL;
+ {
+ sections_being_created = NULL;
+ sections_being_created_abfd = abfd;
+ }
return ret;
}