diff options
author | Jim Blandy <jimb@codesourcery.com> | 2004-09-08 21:58:19 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2004-09-08 21:58:19 +0000 |
commit | 7b90c3f96efc132cac934b3f2b43da899d46eae0 (patch) | |
tree | c956505ed511fa6e4ec307ae552a7492570a7351 /gdb/symfile.c | |
parent | 10b016c223f165a06dbd20e46307c9a0bfbf0ee2 (diff) | |
download | binutils-7b90c3f96efc132cac934b3f2b43da899d46eae0.zip binutils-7b90c3f96efc132cac934b3f2b43da899d46eae0.tar.gz binutils-7b90c3f96efc132cac934b3f2b43da899d46eae0.tar.bz2 |
Fix bug reported and analyzed by Olivier Crete:
* symfile.c (copy_section_addr_info): New function.
(symbol_file_add_with_addrs_or_offsets): Use it to save the
original set of address arguments, instead of handwritten code
that uses one length to allocate and a different length to
initialize. Use make_cleanup_free_section_addr_info.
* symfile.h (copy_section_addr_info): New declaration.
* utils.c: #include "symfile.h".
(do_free_section_addr_info, make_cleanup_free_section_addr_info):
New functions.
* defs.h (make_cleanup_free_section_addr_info): New declaration.
* Makefile.in (utils.o): Update dependencies.
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r-- | gdb/symfile.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c index d0ec083..59fc378 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -324,6 +324,32 @@ alloc_section_addr_info (size_t num_sections) return sap; } + +/* Return a freshly allocated copy of ADDRS. The section names, if + any, are also freshly allocated copies of those in ADDRS. */ +struct section_addr_info * +copy_section_addr_info (struct section_addr_info *addrs) +{ + struct section_addr_info *copy + = alloc_section_addr_info (addrs->num_sections); + int i; + + copy->num_sections = addrs->num_sections; + for (i = 0; i < addrs->num_sections; i++) + { + copy->other[i].addr = addrs->other[i].addr; + if (addrs->other[i].name) + copy->other[i].name = xstrdup (addrs->other[i].name); + else + copy->other[i].name = NULL; + copy->other[i].sectindex = addrs->other[i].sectindex; + } + + return copy; +} + + + /* Build (allocate and populate) a section_addr_info struct from an existing section table. */ @@ -772,7 +798,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, struct objfile *objfile; struct partial_symtab *psymtab; char *debugfile; - struct section_addr_info *orig_addrs; + struct section_addr_info *orig_addrs = NULL; struct cleanup *my_cleanups; const char *name = bfd_get_filename (abfd); @@ -790,14 +816,10 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty, objfile = allocate_objfile (abfd, flags); discard_cleanups (my_cleanups); - orig_addrs = alloc_section_addr_info (bfd_count_sections (abfd)); - my_cleanups = make_cleanup (xfree, orig_addrs); if (addrs) { - int i; - orig_addrs->num_sections = addrs->num_sections; - for (i = 0; i < addrs->num_sections; i++) - orig_addrs->other[i] = addrs->other[i]; + orig_addrs = copy_section_addr_info (addrs); + make_cleanup_free_section_addr_info (orig_addrs); } /* We either created a new mapped symbol table, mapped an existing |