diff options
author | David MacKenzie <djm@cygnus> | 1994-02-12 00:45:54 +0000 |
---|---|---|
committer | David MacKenzie <djm@cygnus> | 1994-02-12 00:45:54 +0000 |
commit | 9783e04a6438e7d81c48d202b2c1bfab315a91f8 (patch) | |
tree | c0b1b81e04a3a8860ba5f17bc8b45c24ec36886c /bfd/aoutx.h | |
parent | 704bbd0dc3077602741acddeead509558c4cc032 (diff) | |
download | gdb-9783e04a6438e7d81c48d202b2c1bfab315a91f8.zip gdb-9783e04a6438e7d81c48d202b2c1bfab315a91f8.tar.gz gdb-9783e04a6438e7d81c48d202b2c1bfab315a91f8.tar.bz2 |
Make all callers of malloc or realloc (including via obstacks)
check the result for NULL. Most set bfd_error to no_memory and
return in that case; a few are harder to fix, and are marked
with "FIXME <return type>".
* elf32-hppa.c (hppa_elf_build_arg_reloc_stub
hppa_elf_build_long_branch_stub): Check bfd_make_empty_symbol return.
* linker.c (_bfd_generic_link_output_symbols
_bfd_generic_link_write_global_symbol): Ditto
* section.c (bfd_make_section_anyway): Ditto.
* tekhex.c (find_chunk tekhex_mkobject): Check bfd_alloc.
(first_phase): Ditto. FIXME void
(tekhex_make_empty_symbol): Check bfd_zalloc.
* sunos.c (sunos_read_dynamic_info): Check bfd_zalloc.
(MY(read_dynamic_symbols) MY(read_dynamic_relocs)): Check bfd_alloc.
* stringhash.c (_bfd_stringtab_hash_newfunc): Check bfd_hash_allocate.
* srec.c: Indent.
(fillup_symbols): Check bfd_alloc. FIXME void
(srec_mkobject srec_get_section_contents
srec_set_section_contents): Check bfd_alloc.
(srec_make_empty_symbol): Check bfd_zalloc.
* som.c (hppa_som_gen_reloc_type): Check bfd_alloc_by_size_t.
(make_unique_section): Check bfd_alloc.
(som_new_section_hook): Check bfd_zalloc.
(bfd_som_attach_aux_hdr): Ditto. FIXME void
* rs6000-core.c (rs6000coff_core_p): Check bfd_zalloc.
* osf-core.c (osf_core_make_empty_symbol): Check bfd_zalloc.
(osf_core_core_file_p): Check bfd_alloc.
* oasys.c (oasys_slurp_symbol_table oasys_archive_p
oasys_mkobject oasys_object_p oasys_new_section_hook
oasys_set_section_contents): Check bfd_alloc.
(oasys_slurp_section_data): Check bfd_zalloc and bfd_alloc.
(oasys_make_empty_symbol): Check bfd_zalloc.
* nlmcode.h (nlm_make_empty_symbol): Check bfd_zalloc.
(nlm_slurp_symbol_table): Check bfd_zalloc and bfd_alloc.
* nlm32-sparc.c (nlm_sparc_read_import): Check bfd_alloc.
* nlm32-i386.c (nlm_i386_read_import): Check bfd_alloc.
* nlm32-alpha.c (nlm_alpha_read_import): Check bfd_alloc.
* linker.c (_bfd_link_hash_newfunc
(generic_link_hash_newfunc
(archive_hash_newfunc
(_bfd_generic_link_add_one_symbol): Check bfd_hash_allocate.
(_bfd_generic_final_link
(_bfd_generic_link_output_symbols
(default_indirect_link_order): Check bfd_alloc.
(bfd_new_link_order): Check bfd_alloc_by_size_t.
* irix-core.c (irix_core_make_empty_symbol): Check bfd_zalloc.
* ieee.c: Indent.
(read_id get_symbol get_section_entry ieee_archive_p ieee_object_p
ieee_slurp_section_data ieee_new_section_hook): Check bfd_alloc.
(do_one): Check bfd_alloc. Return a boolean.
(ieee_slurp_section_data): Check it.
(init_for_output): Check bfd_alloc. Return a boolean.
(ieee_set_section_contents): Check it.
(do_with_relocs): Check bfd_alloc. Return a boolean.
(ieee_bfd_debug_info_accumulate): Ditto. FIXME void.
(ieee_mkobject): Check bfd_zalloc.
(ieee_make_empty_symbol): Check bfd_zmalloc.
* hpux-core.c (hpux_core_make_empty_symbol): Check
bfd_zalloc.
* hppabsd-core.c (hppabsd_core_make_empty_symbol): Check
bfd_zalloc.
(hppabsd_core_core_file_p): Check bfd_zalloc.
* hp300hpux.c (MY(slurp_symbol_table)): Check bfd_alloc.
* elfcode.h (elf_new_section_hook): Check bfd_alloc.
(bfd_section_from_phdr): Ditto.
(write_relocs): Ditto. FIXME void
(elf_map_symbols assign_section_numbers map_program_segments):
Ditto. Return a boolean.
(swap_out_syms): Ditto. Check elf_map_symbols.
(elf_slurp_symbol_table): Check bfd_zalloc.
(elf_slurp_reloca_table): Check bfd_alloc.
(elf_slurp_reloc_table): Ditto.
(elf_compute_section_file_positions): Check assign_section_numbers.
(assign_file_positions_except_relocs): Return a boolean.
Check map_program_segments.
(elf_compute_section_file_positions): Check it.
* elf32-mips.c (mips_elf_final_link): Check bfd_alloc.
* elf32-hppa.c (hppa_elf_stub_branch_reloc): Check bfd_zmalloc and
realloc.
(hppa_elf_stub_reloc): Ditto.
(hppa_elf_build_arg_reloc_stub): Check bfd_zalloc.
(hppa_elf_build_long_branch_stub): Ditto.
(elf32_hppa_backend_symbol_table_processing): Ditto.
* ecoff.c (ecoff_set_symbol_info): Check bfd_alloc. Return a boolean.
(ecoff_slurp_symbol_table): Check it.
(ecoff_slurp_armap): Check bfd_alloc.
(ecoff_write_armap): Check bfd_zalloc.
(ecoff_link_hash_newfunc): Check bfd_hash_allocate and
_bfd_link_hash_newfunc.
(ecoff_link_add_externals): Check bfd_alloc.
* ctor.c (bfd_constructor_entry): Check bfd_alloc.
* coffgen.c (coff_real_object_p): Check bfd_alloc.
(coff_renumber_symbols): Check bfd_alloc_by_size_t. Return a boolean.
(coff_write_symbol): Check bfd_alloc. FIXME int
(coff_write_linenumbers): Check bfd_alloc. Return a boolean.
(coff_section_symbol): Check bfd_alloc_by_size_t.
(coff_get_normalized_symtab): Check bfd_alloc.
(coff_bfd_make_debug_symbol): Check bfd_zalloc.
* libcoff-in.h: Change decls of coff_renumber_symbols,
coff_write_linenumbers.
* libcoff.h: Rebuilt.
* coffcode.h (coff_write_object_contents): Check
coff_renumber_symbols, coff_write_linenumbers.
* coffcode.h: Indent.
(coff_add_missing_symbols): Check bfd_alloc_by_size_t. Return a
boolean.
(coff_write_object_contents): Check it.
* coff-alpha.c (alpha_relocate_section): Check bfd_alloc.
* coff-mips.c (mips_relocate_section): Ditto.
* archive.c (bfd_slurp_bsd_armap_f2): Check bfd_alloc value.
(do_slurp_bsd_armap): Ditto.
(compute_and_write_armap): Check bfd_realloc value.
* aoutx.h (translate_from_native_sym_flags): Check bfd_alloc
return value. Return boolean value.
(NAME(aout,make_empty_symbol)): Check bfd_zalloc return value.
(NAME(aout,slurp_symbol_table)): Check bf_alloc and bfd_zalloc
return value.
(add_to_stringtab): Ditto. FIXME void
(aout_link_hash_newfunc): Check bfd_hash_allocate return value.
(aout_link_add_symbols): Check bfd_alloc value.
(translate_symbol_table): Check translate_from_native_sym_flags.
* hp300hpux.c (MY(slurp_symbol_table)): Ditto.
* aoutx.h (aout_link_hash_newfunc): Check _bfd_link_hash_newfunc.
* opncls.c (bfd_zalloc bfd_realloc): Check result of bfd_alloc.
* opncls.c (obstack_chunk_alloc): Define as malloc, not
bfd_xmalloc_by_size_t.
(_bfd_new_bfd): Check obstack_begin for 0 return.
* ieee.c (obstack_chunk_alloc): Define as malloc, not
bfd_xmalloc_by_size_t.
(ieee_archive_p): Check obstack_begin for 0 return and
obstack_finish for NULL return.
* hash.c (obstack_chunk_alloc): Define as malloc, not
bfd_xmalloc_by_size_t.
(bfd_hash_table_init_n): Check obstack_begin for 0 return and
obstack_finish for NULL return.
(bfd_hash_lookup): Check obstack_alloc for NULL return.
* ecofflink.c (obstack_chunk_alloc): Define as malloc, not
bfd_xmalloc_by_size_t.
bfd_ecoff_debug_accumulate
bfd_ecoff_debug_accumulate_other): Check obstack_alloc.
(add_file_shuffle add_memory_shuffle): Check obstack_alloc for
NULL return. Return boolean, not void.
(bfd_ecoff_debug_init): Check obstack_begin for 0 return.
(bfd_ecoff_debug_accumulate): Check add_file_shuffle
and add_memory_shuffle return.
(string_hash_newfunc): Check bfd_hash_allocate and bfd_hash_newfunc.
(bfd_ecoff_debug_accumulate): Check bfd_alloc.
(ecoff_add_string): Check add_memory_shuffle return.
* libbfd-in.h (xmalloc, bfd_xmalloc, bfd_xmalloc_by_size_t):
Remove decls.
* libbfd.h: Rebuilt.
Diffstat (limited to 'bfd/aoutx.h')
-rw-r--r-- | bfd/aoutx.h | 86 |
1 files changed, 71 insertions, 15 deletions
diff --git a/bfd/aoutx.h b/bfd/aoutx.h index bff9b2b..d5698dc 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -1,5 +1,5 @@ /* BFD semi-generic back-end for a.out binaries. - Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -452,7 +452,7 @@ DEFUN(NAME(aout,some_aout_object_p),(abfd, execp, callback_to_real_object_p), #ifdef THIS_IS_ONLY_DOCUMENTATION /* The common code can't fill in these things because they depend on either the start address of the text segment, the rounding - up of virtual addersses between segments, or the starting file + up of virtual addresses between segments, or the starting file position of the text segment -- all of which varies among different versions of a.out. */ @@ -1083,7 +1083,7 @@ DEFUN(NAME(aout,set_section_contents),(abfd, section, location, offset, count), /* Only in their own functions for ease of debugging; when sym flags have stabilised these should be inlined into their (single) caller */ -static void +static boolean DEFUN (translate_from_native_sym_flags, (sym_pointer, cache_ptr, abfd), struct external_nlist *sym_pointer AND aout_symbol_type * cache_ptr AND @@ -1100,8 +1100,14 @@ DEFUN (translate_from_native_sym_flags, (sym_pointer, cache_ptr, abfd), char *copy = bfd_alloc (abfd, strlen (cache_ptr->symbol.name) + 1); asection *section; asection *into_section; - arelent_chain *reloc = (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain)); + + if (!copy || !reloc) + { + bfd_error = no_memory; + return false; + } + strcpy (copy, cache_ptr->symbol.name); /* Make sure that this bfd has a section with the right contructor @@ -1130,7 +1136,8 @@ DEFUN (translate_from_native_sym_flags, (sym_pointer, cache_ptr, abfd), cache_ptr->type = N_BSS; break; default: - abort (); + bfd_error = bad_value; + return false; } /* Build a relocation pointing into the constuctor section @@ -1292,10 +1299,10 @@ DEFUN (translate_from_native_sym_flags, (sym_pointer, cache_ptr, abfd), } if (cache_ptr->symbol.section == 0) abort (); + return true; } - static boolean DEFUN(translate_to_native_sym_flags,(sym_pointer, cache_ptr, abfd), struct external_nlist *sym_pointer AND @@ -1384,6 +1391,11 @@ DEFUN(NAME(aout,make_empty_symbol),(abfd), { aout_symbol_type *new = (aout_symbol_type *)bfd_zalloc (abfd, sizeof (aout_symbol_type)); + if (!new) + { + bfd_error = no_memory; + return NULL; + } new->symbol.the_bfd = abfd; return &new->symbol; @@ -1429,7 +1441,8 @@ translate_symbol_table (abfd, in, ext, count, str, strsize, dynamic) in->type = bfd_h_get_8 (abfd, ext->e_type); in->symbol.udata = 0; - translate_from_native_sym_flags (ext, in, abfd); + if (!translate_from_native_sym_flags (ext, in, abfd)) + return false; if (dynamic) in->symbol.flags |= BSF_DYNAMIC; @@ -1489,7 +1502,12 @@ DEFUN(NAME(aout,slurp_symbol_table),(abfd), * sizeof (aout_symbol_type)))); /* Don't allocate on the obstack, so we can free it easily. */ - syms = (struct external_nlist *) bfd_xmalloc(symbol_size); + syms = (struct external_nlist *) malloc(symbol_size); + if (!strings || !cached || !syms) + { + bfd_error = no_memory; + return false; + } bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET); if (bfd_read ((PTR)syms, 1, symbol_size, abfd) != symbol_size) { @@ -1823,6 +1841,11 @@ add_to_stringtab (abfd, str, tab) add_it: entry = (struct stringtab_entry *) bfd_alloc_by_size_t (abfd, sizeof (struct stringtab_entry)); + if (!entry) + { + bfd_error = no_memory; + abort(); /* FIXME */ + } entry->less = entry->greater = 0; entry->hash = hashval; @@ -2806,14 +2829,19 @@ aout_link_hash_newfunc (entry, table, string) if (ret == (struct aout_link_hash_entry *) NULL) ret = ((struct aout_link_hash_entry *) bfd_hash_allocate (table, sizeof (struct aout_link_hash_entry))); + if (ret == (struct aout_link_hash_entry *) NULL) + { + bfd_error = no_memory; + return (struct bfd_hash_entry *) ret; + } /* Call the allocation method of the superclass. */ ret = ((struct aout_link_hash_entry *) _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - /* Set local fields. */ - ret->indx = -1; + if (ret) + /* Set local fields. */ + ret->indx = -1; return (struct bfd_hash_entry *) ret; } @@ -2827,7 +2855,12 @@ NAME(aout,link_hash_table_create) (abfd) struct aout_link_hash_table *ret; ret = ((struct aout_link_hash_table *) - bfd_xmalloc (sizeof (struct aout_link_hash_table))); + malloc (sizeof (struct aout_link_hash_table))); + if (ret == (struct aout_link_hash_table *) NULL) + { + bfd_error = no_memory; + return (struct bfd_link_hash_table *) NULL; + } if (! _bfd_link_hash_table_init (&ret->root, abfd, aout_link_hash_newfunc)) { @@ -2952,11 +2985,16 @@ aout_link_get_symbols (abfd) count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE; - /* We allocate using bfd_xmalloc to make the values easy to free + /* We allocate using malloc to make the values easy to free later on. If we put them on the obstack it might not be possible to free them. */ syms = ((struct external_nlist *) - bfd_xmalloc ((size_t) count * EXTERNAL_NLIST_SIZE)); + malloc ((size_t) count * EXTERNAL_NLIST_SIZE)); + if (syms == (struct external_nlist *) NULL) + { + bfd_error = no_memory; + return false; + } if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 || (bfd_read ((PTR) syms, 1, exec_hdr (abfd)->a_syms, abfd) @@ -2969,7 +3007,12 @@ aout_link_get_symbols (abfd) != BYTES_IN_WORD)) return false; stringsize = GET_WORD (abfd, string_chars); - strings = (char *) bfd_xmalloc ((size_t) stringsize); + strings = (char *) malloc ((size_t) stringsize); + if (strings == NULL) + { + bfd_error = no_memory; + return false; + } /* Skip space for the string count in the buffer for convenience when using indexes. */ @@ -3155,6 +3198,11 @@ aout_link_add_symbols (abfd, info) bfd_alloc (abfd, ((size_t) sym_count * sizeof (struct aout_link_hash_entry *)))); + if (!sym_hash) + { + bfd_error = no_memory; + return false; + } obj_aout_sym_hashes (abfd) = sym_hash; p = obj_aout_external_syms (abfd); @@ -3857,6 +3905,14 @@ aout_link_write_other_symbol (h, data) if (h->root.written) return true; + h->root.written = true; + + if (finfo->info->strip == strip_all + || (finfo->info->strip == strip_some + && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string, + false, false) == NULL)) + return true; + output_bfd = finfo->output_bfd; switch (h->root.type) |