[rfc] Do not crash reading UPX binaries
Daniel Jacobowitz
drow@false.org
Sun Jul 1 21:56:00 GMT 2007
This patch issues an error instead of a segfault on the testcase
in PR 2280. UPX is a binary compression system; it's infamous for
producing very strange files, which are only "just valid enough".
In this case, it claims that the symbol table is at a large offset
in a very small file.
I don't think it's worth supporting files this modified. Does anyone
think we need to do better, or shall I check in the attached?
--
Daniel Jacobowitz
CodeSourcery
2007-07-01 Daniel Jacobowitz <dan@codesourcery.com>
PR gdb/2280
* coffread.c (read_one_sym): Check for read errors.
Index: coffread.c
===================================================================
RCS file: /cvs/src/src/gdb/coffread.c,v
retrieving revision 1.73
diff -u -p -r1.73 coffread.c
--- coffread.c 19 Jun 2007 17:21:51 -0000 1.73
+++ coffread.c 1 Jul 2007 21:53:06 -0000
@@ -1118,20 +1118,29 @@ read_one_sym (struct coff_symbol *cs,
union internal_auxent *aux)
{
int i;
+ bfd_size_type bytes;
cs->c_symnum = symnum;
- bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
+ bytes = bfd_bread (temp_sym, local_symesz, nlist_bfd_global);
+ if (bytes != local_symesz)
+ error ("%s: error reading symbols", current_objfile->name);
bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym);
cs->c_naux = sym->n_numaux & 0xff;
if (cs->c_naux >= 1)
{
- bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+ bytes = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+ if (bytes != local_auxesz)
+ error ("%s: error reading symbols", current_objfile->name);
bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
0, cs->c_naux, (char *) aux);
/* If more than one aux entry, read past it (only the first aux
is important). */
for (i = 1; i < cs->c_naux; i++)
- bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+ {
+ bytes = bfd_bread (temp_aux, local_auxesz, nlist_bfd_global);
+ if (bytes != local_auxesz)
+ error ("%s: error reading symbols", current_objfile->name);
+ }
}
cs->c_name = getsymname (sym);
cs->c_value = sym->n_value;
More information about the Gdb-patches
mailing list