aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffcode.h
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-11-05 10:13:16 +0000
committerNick Clifton <nickc@redhat.com>2014-11-05 10:13:16 +0000
commit20ad5e2842911039a60b6bdf9880cee895179e43 (patch)
tree60c1883ca19d125970f9d60ad04cb32cced0ffcc /bfd/coffcode.h
parent1ae1b8cc656639e18715829cbcd72916e86f3324 (diff)
downloadgdb-20ad5e2842911039a60b6bdf9880cee895179e43.zip
gdb-20ad5e2842911039a60b6bdf9880cee895179e43.tar.gz
gdb-20ad5e2842911039a60b6bdf9880cee895179e43.tar.bz2
More fixes for processing corrupt files.
PR binutils/17512 * coffcode.h (coff_set_alignment_hook): Warn if the file lies about the number of relocations it contains. (coff_sort_func_alent): Return 0 if the pointers are NULL. (coff_slurp_line_table): Add more range checks. Do not free new tables created when sorting line numbers. * peXXigen.c (pe_print_idata): Add range checks. (pe_print_edata): Likewise. (rsrc_print_resource_entries): Likewise. Avoid printing control characters. Terminate priniting if corruption is detected. (rsrc_print_resource_directory): Terminate printing if an unknown directory type is encountered. (pe_print_debugdata): Fix off-by-one error. (rsrc_count_entries): Add range checking. (rsrc_parse_entry): Likewise.
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r--bfd/coffcode.h28
1 files changed, 23 insertions, 5 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 48709f4..ab76083 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -1920,6 +1920,15 @@ coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED,
if (bfd_seek (abfd, oldpos, 0) != 0)
return;
section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1;
+ /* PR binutils/17512: Stop corrupt files from causing
+ memory problems if they claim to have too many relocs. */
+ if (section->reloc_count * relsz > (bfd_size_type) bfd_get_size (abfd))
+ {
+ (*_bfd_error_handler)
+ ("%s: warning: claims to have %#x relocs, but the file is not that big",
+ bfd_get_filename (abfd), section->reloc_count);
+ section->reloc_count = 0;
+ }
section->rel_filepos += relsz;
}
else if (hdr->s_nreloc == 0xffff)
@@ -4494,6 +4503,8 @@ coff_sort_func_alent (const void * arg1, const void * arg2)
const coff_symbol_type *s1 = (const coff_symbol_type *) (al1->u.sym);
const coff_symbol_type *s2 = (const coff_symbol_type *) (al2->u.sym);
+ if (s1 == NULL || s2 == NULL)
+ return 0;
if (s1->symbol.value < s2->symbol.value)
return -1;
else if (s1->symbol.value > s2->symbol.value)
@@ -4518,7 +4529,9 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
BFD_ASSERT (asect->lineno == NULL);
amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
- lineno_cache = (alent *) bfd_alloc (abfd, amt);
+ if (amt > (bfd_size_type) bfd_get_size (abfd))
+ return FALSE;
+ lineno_cache = (alent *) bfd_zalloc (abfd, amt);
if (lineno_cache == NULL)
return FALSE;
@@ -4566,6 +4579,9 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
((symndx + obj_raw_syments (abfd))
->u.syment._n._n_n._n_zeroes));
cache_ptr->u.sym = (asymbol *) sym;
+ if (sym == NULL)
+ continue;
+
if (sym->lineno != NULL)
(*_bfd_error_handler)
(_("%B: warning: duplicate line number information for `%s'"),
@@ -4609,7 +4625,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
/* Create the new sorted table. */
amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
- n_lineno_cache = (alent *) bfd_alloc (abfd, amt);
+ n_lineno_cache = (alent *) bfd_zalloc (abfd, amt);
if (n_lineno_cache != NULL)
{
alent *n_cache_ptr = n_lineno_cache;
@@ -4621,8 +4637,9 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
/* Copy the function entry and update it. */
*n_cache_ptr = *old_ptr;
- sym = (coff_symbol_type *)n_cache_ptr->u.sym;
- sym->lineno = n_cache_ptr;
+ sym = (coff_symbol_type *) n_cache_ptr->u.sym;
+ if (sym != NULL)
+ sym->lineno = n_cache_ptr;
n_cache_ptr++;
old_ptr++;
@@ -4633,7 +4650,8 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
n_cache_ptr->line_number = 0;
memcpy (lineno_cache, n_lineno_cache, amt);
}
- bfd_release (abfd, func_table);
+ /* PR binutils/17512: Do *not* free the func table
+ and new lineno cache - they are now being used. */
}
}