X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Frdcoff.c;h=4eb4d1579092b96a4c2721750204a8844c9e637f;hb=e4b7104b1e0c70613d0f553cb18d25c7343647d3;hp=1eda3af195d1ce22838428537881529ecc144411;hpb=b43b5d5f768ed7a7a150d78c9fda0c194a11497d;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rdcoff.c b/binutils/rdcoff.c index 1eda3af195..4eb4d15790 100644 --- a/binutils/rdcoff.c +++ b/binutils/rdcoff.c @@ -1,12 +1,12 @@ /* stabs.c -- Parse COFF debugging information - Copyright 1996, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1996-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -21,10 +21,11 @@ /* This file contains code which parses COFF debugging information. */ +#include "sysdep.h" #include "bfd.h" #include "coff/internal.h" -#include "bucomm.h" #include "libiberty.h" +#include "bucomm.h" #include "debug.h" #include "budbg.h" @@ -82,7 +83,7 @@ struct coff_types debug_type basic[T_MAX + 1]; }; -static debug_type *coff_get_slot (struct coff_types *, int); +static debug_type *coff_get_slot (struct coff_types *, long); static debug_type parse_coff_type (bfd *, struct coff_symbols *, struct coff_types *, long, int, union internal_auxent *, bfd_boolean, void *); @@ -103,12 +104,17 @@ static bfd_boolean external_coff_symbol_p (int sym_class); /* Return the slot for a type. */ static debug_type * -coff_get_slot (struct coff_types *types, int indx) +coff_get_slot (struct coff_types *types, long indx) { struct coff_slots **pps; pps = &types->slots; + /* PR 17512: file: 078-18333-0.001:0.1. + FIXME: The value of 1000 is a guess. Maybe a better heuristic is needed. */ + if (indx / COFF_SLOTS > 1000) + fatal (_("Excessively large slot index: %lx"), indx); + while (indx >= COFF_SLOTS) { if (*pps == NULL) @@ -403,6 +409,7 @@ parse_coff_struct_type (bfd *abfd, struct coff_symbols *symbols, { non_fatal (_("bfd_coff_get_syment failed: %s"), bfd_errmsg (bfd_get_error ())); + free (fields); return DEBUG_TYPE_NULL; } @@ -419,6 +426,7 @@ parse_coff_struct_type (bfd *abfd, struct coff_symbols *symbols, { non_fatal (_("bfd_coff_get_auxent failed: %s"), bfd_errmsg (bfd_get_error ())); + free (fields); return DEBUG_TYPE_NULL; } psubaux = &auxent; @@ -508,6 +516,8 @@ parse_coff_enum_type (bfd *abfd, struct coff_symbols *symbols, { non_fatal (_("bfd_coff_get_syment failed: %s"), bfd_errmsg (bfd_get_error ())); + free (names); + free (vals); return DEBUG_TYPE_NULL; } @@ -806,7 +816,7 @@ parse_coff (bfd *abfd, asymbol **syms, long symcount, void *dhandle) else base = auxent.x_sym.x_misc.x_lnsz.x_lnno - 1; - addr = bfd_get_section_vma (abfd, bfd_get_section (sym)); + addr = bfd_section_vma (bfd_asymbol_section (sym)); ++linenos;