X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcoff-alpha.c;h=cb52668734460399ae9436e36a89cb8dbbfb3112;hb=2e573c0a3f9de232587f75de0af765abb8e193b9;hp=ee4a3eeded70f66e1d786e35e582839b75c8436d;hpb=cb7f4b298e5e0a3ab4fb6b13aa89e970478597bc;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index ee4a3eeded..cb52668734 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; } } @@ -1127,13 +1127,11 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd, abort (); successful_return: - if (reloc_vector != NULL) - free (reloc_vector); + free (reloc_vector); return data; error_return: - if (reloc_vector != NULL) - free (reloc_vector); + free (reloc_vector); return NULL; } @@ -1237,7 +1235,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 +1926,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 +2024,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 +2048,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 +2082,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; @@ -2119,7 +2128,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos) n = dict[h]; else { - if (! bfd_bread (&n, (bfd_size_type) 1, nbfd)) + if (bfd_bread (&n, 1, nbfd) != 1) goto error_return; dict[h] = n; } @@ -2160,8 +2169,7 @@ alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos) return nbfd; error_return: - if (buf != NULL) - free (buf); + free (buf); if (nbfd != NULL) bfd_close (nbfd); return NULL; @@ -2413,7 +2421,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 */