X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Farchive64.c;h=5e1443932cef5e10f775cb060908766ccc36534d;hb=a435742a7fb32f6320ce0e6074e2500e28378104;hp=a2c628e2b55ede4bca6766ec83f68bf9d1e44270;hpb=97b031c5d6d42ff2b1758a8a8c332cb44ba9c06f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/archive64.c b/bfd/archive64.c index a2c628e2b5..5e1443932c 100644 --- a/bfd/archive64.c +++ b/bfd/archive64.c @@ -1,5 +1,5 @@ /* Support for 64-bit archives. - Copyright (C) 1996-2019 Free Software Foundation, Inc. + Copyright (C) 1996-2020 Free Software Foundation, Inc. Ian Lance Taylor, Cygnus Support Linker support added by Mark Mitchell, CodeSourcery, LLC. @@ -47,6 +47,7 @@ _bfd_archive_64_bit_slurp_armap (bfd *abfd) bfd_byte *raw_armap = NULL; carsym *carsyms; bfd_size_type amt; + ufile_ptr filesize; ardata->symdefs = NULL; @@ -66,7 +67,7 @@ _bfd_archive_64_bit_slurp_armap (bfd *abfd) if (! CONST_STRNEQ (nextname, "/SYM64/ ")) { - bfd_has_map (abfd) = FALSE; + abfd->has_armap = FALSE; return TRUE; } @@ -76,6 +77,13 @@ _bfd_archive_64_bit_slurp_armap (bfd *abfd) parsed_size = mapdata->parsed_size; free (mapdata); + filesize = bfd_get_file_size (abfd); + if (filesize != 0 && parsed_size > filesize) + { + bfd_set_error (bfd_error_malformed_archive); + return FALSE; + } + if (bfd_bread (int_buf, 8, abfd) != 8) { if (bfd_get_error () != bfd_error_system_call) @@ -102,22 +110,19 @@ _bfd_archive_64_bit_slurp_armap (bfd *abfd) bfd_set_error (bfd_error_malformed_archive); return FALSE; } - ardata->symdefs = (struct carsym *) bfd_zalloc (abfd, amt); + ardata->symdefs = (struct carsym *) bfd_alloc (abfd, amt); if (ardata->symdefs == NULL) return FALSE; carsyms = ardata->symdefs; stringbase = ((char *) ardata->symdefs) + carsym_size; - raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize); - if (raw_armap == NULL) - goto release_symdefs; - - if (bfd_bread (raw_armap, ptrsize, abfd) != ptrsize + raw_armap = (bfd_byte *) _bfd_alloc_and_read (abfd, ptrsize, ptrsize); + if (raw_armap == NULL || bfd_bread (stringbase, stringsize, abfd) != stringsize) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_malformed_archive); - goto release_raw_armap; + goto release_symdefs; } stringend = stringbase + stringsize; @@ -137,14 +142,12 @@ _bfd_archive_64_bit_slurp_armap (bfd *abfd) /* Pad to an even boundary if you have to. */ ardata->first_file_filepos += (ardata->first_file_filepos) % 2; - bfd_has_map (abfd) = TRUE; + abfd->has_armap = TRUE; bfd_release (abfd, raw_armap); return TRUE; -release_raw_armap: - bfd_release (abfd, raw_armap); -release_symdefs: + release_symdefs: bfd_release (abfd, ardata->symdefs); return FALSE; }