diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-30 11:48:20 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-30 13:29:24 +1030 |
commit | 6a89db5c9513d5e00e02b01095bf0c18e496dcc8 (patch) | |
tree | 31cd8716958eb7acd9d9f07b43e0fb31f4ef0929 | |
parent | 61b3df8f5b7c75e51a4fe45bc7e479b4b482a1cd (diff) | |
download | gdb-6a89db5c9513d5e00e02b01095bf0c18e496dcc8.zip gdb-6a89db5c9513d5e00e02b01095bf0c18e496dcc8.tar.gz gdb-6a89db5c9513d5e00e02b01095bf0c18e496dcc8.tar.bz2 |
archive.c bfd_zalloc
Quite a few bfd_zalloc calls are wasting time clearing memory, and
should be bfd_alloc instead.
* archive.c (do_slurp_bsd_armap): Use bfd_alloc rather than
bfd_zalloc when memory is all written after the call.
(do_slurp_coff_armap): Likewise. Set bfd_error on ridiculously
large allocations that overflow bfd_size_type. Use just one
bfd_release on error exit.
(_bfd_slurp_extended_name_table): Use bfd_alloc for extended_names,
clear last byte rather than the entire array. Use bfd_alloc for
string table. Rearrange and simplify code copying file names.
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/archive.c | 46 |
2 files changed, 32 insertions, 25 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a1e5273..186346e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2019-12-30 Alan Modra <amodra@gmail.com> + + * archive.c (do_slurp_bsd_armap): Use bfd_alloc rather than + bfd_zalloc when memory is all written after the call. + (do_slurp_coff_armap): Likewise. Set bfd_error on ridiculously + large allocations that overflow bfd_size_type. Use just one + bfd_release on error exit. + (_bfd_slurp_extended_name_table): Use bfd_alloc for extended_names, + clear last byte rather than the entire array. Use bfd_alloc for + string table. Rearrange and simplify code copying file names. + 2019-12-29 Alan Modra <amodra@gmail.com> * vms-alpha.c (_bfd_vms_slurp_egsd): Make base_addr a bfd_vma. diff --git a/bfd/archive.c b/bfd/archive.c index 6b7a78c..578df09 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -968,7 +968,7 @@ do_slurp_bsd_armap (bfd *abfd) if (parsed_size < 4) return FALSE; - raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size); + raw_armap = (bfd_byte *) bfd_alloc (abfd, parsed_size); if (raw_armap == NULL) return FALSE; @@ -1059,16 +1059,22 @@ do_slurp_coff_armap (bfd *abfd) bsd-style one in core all at once, for simplicity. */ if (nsymz > ~ (bfd_size_type) 0 / sizeof (carsym)) - return FALSE; + { + bfd_set_error (bfd_error_no_memory); + return FALSE; + } carsym_size = (nsymz * sizeof (carsym)); ptrsize = (4 * nsymz); if (carsym_size + stringsize + 1 <= carsym_size) - return FALSE; + { + bfd_set_error (bfd_error_no_memory); + return FALSE; + } - ardata->symdefs = (struct carsym *) bfd_zalloc (abfd, - carsym_size + stringsize + 1); + ardata->symdefs = (struct carsym *) bfd_alloc (abfd, + carsym_size + stringsize + 1); if (ardata->symdefs == NULL) return FALSE; carsyms = ardata->symdefs; @@ -1083,7 +1089,7 @@ do_slurp_coff_armap (bfd *abfd) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_malformed_archive); - goto release_raw_armap; + goto release_symdefs; } /* OK, build the carsyms. */ @@ -1128,8 +1134,6 @@ do_slurp_coff_armap (bfd *abfd) return TRUE; -release_raw_armap: - bfd_release (abfd, raw_armap); release_symdefs: bfd_release (abfd, (ardata)->symdefs); return FALSE; @@ -1238,7 +1242,7 @@ _bfd_slurp_extended_name_table (bfd *abfd) goto byebye; bfd_ardata (abfd)->extended_names_size = amt; - bfd_ardata (abfd)->extended_names = (char *) bfd_zalloc (abfd, amt + 1); + bfd_ardata (abfd)->extended_names = (char *) bfd_alloc (abfd, amt + 1); if (bfd_ardata (abfd)->extended_names == NULL) { byebye: @@ -1256,6 +1260,7 @@ _bfd_slurp_extended_name_table (bfd *abfd) bfd_ardata (abfd)->extended_names = NULL; goto byebye; } + bfd_ardata (abfd)->extended_names[amt] = 0; /* Since the archive is supposed to be printable if it contains text, the entries in the list are newline-padded, not null @@ -1607,7 +1612,7 @@ _bfd_construct_extended_name_table (bfd *abfd, if (total_namelen == 0) return TRUE; - *tabloc = (char *) bfd_zalloc (abfd, total_namelen); + *tabloc = (char *) bfd_alloc (abfd, total_namelen); if (*tabloc == NULL) return FALSE; @@ -1664,16 +1669,14 @@ _bfd_construct_extended_name_table (bfd *abfd, stroff = last_stroff; else { - strcpy (strptr, normal); - if (! trailing_slash) - strptr[thislen] = ARFMAG[1]; - else - { - strptr[thislen] = '/'; - strptr[thislen + 1] = ARFMAG[1]; - } + last_filename = filename; stroff = strptr - *tabloc; last_stroff = stroff; + memcpy (strptr, normal, thislen); + strptr += thislen; + if (trailing_slash) + *strptr++ = '/'; + *strptr++ = ARFMAG[1]; } hdr->ar_name[0] = ar_padchar (current); if (bfd_is_thin_archive (abfd) && current->origin > 0) @@ -1686,13 +1689,6 @@ _bfd_construct_extended_name_table (bfd *abfd, } else _bfd_ar_spacepad (hdr->ar_name + 1, maxname - 1, "%-ld", stroff); - if (normal != last_filename) - { - strptr += thislen + 1; - if (trailing_slash) - ++strptr; - last_filename = filename; - } } } |