X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcoff-alpha.c;h=b86a8a259b584dd30481389b398fa4f6851ca932;hb=c15a8f173e9b01dd962ba857b7deb547d34bca5b;hp=726d20bfbbf5240e5169e47799017a71601de7aa;hpb=827041555ac443bd57340060f3e034fd7b199dd8;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index 726d20bfbb..b86a8a259b 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -1,5 +1,5 @@ /* BFD back-end for ALPHA Extended-Coff files. - Copyright (C) 1993-2019 Free Software Foundation, Inc. + Copyright (C) 1993-2020 Free Software Foundation, Inc. Modified from coff-mips.c by Steve Chamberlain and Ian Lance Taylor . @@ -398,10 +398,10 @@ static reloc_howto_type alpha_howto_table[] = /* Recognize an Alpha ECOFF file. */ -static const bfd_target * +static bfd_cleanup alpha_ecoff_object_p (bfd *abfd) { - static const bfd_target *ret; + bfd_cleanup ret; ret = coff_object_p (abfd); @@ -423,10 +423,10 @@ alpha_ecoff_object_p (bfd *abfd) { bfd_size_type size; - size = sec->line_filepos * 8; + size = (bfd_size_type) sec->line_filepos * 8; BFD_ASSERT (size == sec->size || size + 8 == sec->size); - if (! bfd_set_section_size (abfd, sec, size)) + if (!bfd_set_section_size (sec, size)) return NULL; } } @@ -1237,7 +1237,7 @@ alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED, /* Compute a new r_symndx value. */ hsec = h->root.u.def.section; - name = bfd_get_section_name (output_bfd, hsec->output_section); + name = bfd_section_name (hsec->output_section); r_symndx = (unsigned long) -1; switch (name[1]) @@ -1928,8 +1928,7 @@ alpha_relocate_section (bfd *output_bfd, if (r_extern) name = sym_hashes[r_symndx]->root.root.string; else - name = bfd_section_name (input_bfd, - symndx_to_section[r_symndx]); + name = bfd_section_name (symndx_to_section[r_symndx]); (*info->callbacks->reloc_overflow) (info, NULL, name, alpha_howto_table[r_type].name, (bfd_vma) 0, input_bfd, input_section, @@ -2027,7 +2026,10 @@ alpha_ecoff_read_ar_hdr (bfd *abfd) if (bfd_seek (abfd, (file_ptr) FILHSZ, SEEK_CUR) != 0 || bfd_bread (ab, (bfd_size_type) 8, abfd) != 8 || bfd_seek (abfd, (file_ptr) (- (FILHSZ + 8)), SEEK_CUR) != 0) - return NULL; + { + free (ret); + return NULL; + } ret->parsed_size = H_GET_64 (abfd, ab); } @@ -2048,6 +2050,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos) bfd_size_type size; bfd_byte *buf, *p; struct bfd_in_memory *bim; + ufile_ptr filesize; buf = NULL; nbfd = _bfd_get_elt_at_filepos (archive, filepos); @@ -2081,6 +2084,14 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos) goto error_return; size = H_GET_64 (nbfd, ab); + /* The decompression algorithm will at most expand by eight times. */ + filesize = bfd_get_file_size (archive); + if (filesize != 0 && size / 8 > filesize) + { + bfd_set_error (bfd_error_malformed_archive); + goto error_return; + } + if (size != 0) { bfd_size_type left; @@ -2390,6 +2401,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data = #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section +#define _bfd_ecoff_bfd_group_name bfd_generic_group_name #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group #define _bfd_ecoff_section_already_linked \ _bfd_coff_section_already_linked @@ -2412,7 +2424,8 @@ const bfd_target alpha_ecoff_le_vec = | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE + | SEC_DATA | SEC_SMALL_DATA), 0, /* leading underscore */ ' ', /* ar_pad_char */ 15, /* ar_max_namelen */