diff options
author | Jon Turney <jon.turney@dronecode.org.uk> | 2014-04-03 12:26:27 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2014-04-03 12:26:27 +0100 |
commit | b69c87280595b7ce4e956cb2a62278412f0722f7 (patch) | |
tree | d575796ac064d8df4e6a78020fcfea673efe4104 /bfd/peXXigen.c | |
parent | 1b6aeedbb8e8f6c65d228f0dab3dab522d2517bb (diff) | |
download | fsf-binutils-gdb-b69c87280595b7ce4e956cb2a62278412f0722f7.zip fsf-binutils-gdb-b69c87280595b7ce4e956cb2a62278412f0722f7.tar.gz fsf-binutils-gdb-b69c87280595b7ce4e956cb2a62278412f0722f7.tar.bz2 |
* peXXigen.c (pe_print_edata): Verify edt.name lies inside
section before dereferencing.
(pe_print_idata, pe_print_edata, pe_print_reloc)
(rsrc_print_section): Don't bother interpreting the contents
of sections which have no contents.
Diffstat (limited to 'bfd/peXXigen.c')
-rw-r--r-- | bfd/peXXigen.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 6d95827..e78edaa 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1111,6 +1111,13 @@ pe_print_idata (bfd * abfd, void * vfile) _("\nThere is an import table, but the section containing it could not be found\n")); return TRUE; } + else if (!(section->flags & SEC_HAS_CONTENTS)) + { + fprintf (file, + _("\nThere is an import table in %s, but that section has no contents\n"), + section->name); + return TRUE; + } } fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"), @@ -1373,7 +1380,7 @@ pe_print_edata (bfd * abfd, void * vfile) bfd_size_type datasize = 0; bfd_size_type dataoff; bfd_size_type i; - bfd_signed_vma adj; + bfd_vma adj; struct EDT_type { long export_flags; /* Reserved - should be zero. */ @@ -1423,6 +1430,13 @@ pe_print_edata (bfd * abfd, void * vfile) _("\nThere is an export table, but the section containing it could not be found\n")); return TRUE; } + else if (!(section->flags & SEC_HAS_CONTENTS)) + { + fprintf (file, + _("\nThere is an export table in %s, but that section has no contents\n"), + section->name); + return TRUE; + } dataoff = addr - section->vma; datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size; @@ -1478,8 +1492,11 @@ pe_print_edata (bfd * abfd, void * vfile) fprintf (file, _("Name \t\t\t\t")); bfd_fprintf_vma (abfd, file, edt.name); - fprintf (file, - " %s\n", data + edt.name - adj); + + if ((edt.name >= adj) && (edt.name < adj + datasize)) + fprintf (file, " %s\n", data + edt.name - adj); + else + fprintf (file, "(outside .edata section)\n"); fprintf (file, _("Ordinal Base \t\t\t%ld\n"), edt.base); @@ -1927,10 +1944,7 @@ pe_print_reloc (bfd * abfd, void * vfile) bfd_size_type i; bfd_size_type start, stop; - if (section == NULL) - return TRUE; - - if (section->size == 0) + if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS)) return TRUE; fprintf (file, @@ -2166,7 +2180,6 @@ rsrc_print_section (bfd * abfd, void * vfile) bfd_byte * dataend; bfd_byte * datastart; - pe = pe_data (abfd); if (pe == NULL) return TRUE; @@ -2174,13 +2187,15 @@ rsrc_print_section (bfd * abfd, void * vfile) section = bfd_get_section_by_name (abfd, ".rsrc"); if (section == NULL) return TRUE; - - rva_bias = section->vma - pe->pe_opthdr.ImageBase; + if (!(section->flags & SEC_HAS_CONTENTS)) + return TRUE; datasize = section->size; if (datasize == 0) return TRUE; + rva_bias = section->vma - pe->pe_opthdr.ImageBase; + if (! bfd_malloc_and_get_section (abfd, section, & data)) { if (data != NULL) |