aboutsummaryrefslogtreecommitdiff
path: root/bfd/peXXigen.c
diff options
context:
space:
mode:
authorJon Turney <jon.turney@dronecode.org.uk>2014-04-03 12:26:27 +0100
committerNick Clifton <nickc@redhat.com>2014-04-03 12:26:27 +0100
commitb69c87280595b7ce4e956cb2a62278412f0722f7 (patch)
treed575796ac064d8df4e6a78020fcfea673efe4104 /bfd/peXXigen.c
parent1b6aeedbb8e8f6c65d228f0dab3dab522d2517bb (diff)
downloadgdb-b69c87280595b7ce4e956cb2a62278412f0722f7.zip
gdb-b69c87280595b7ce4e956cb2a62278412f0722f7.tar.gz
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.c35
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)