From: H.J. Lu Date: Wed, 28 Jun 2017 18:07:04 +0000 (-0700) Subject: Don't call bfd_get_file_size in _bfd_generic_get_section_contents X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=328ce951b2513a102711bb640496a2f1b5f8d3dd;p=binutils-gdb.git Don't call bfd_get_file_size in _bfd_generic_get_section_contents Since it is impossible to read beyond the end of normal files, we only need to check archive element size in _bfd_generic_get_section_contents * libbfd.c (_bfd_generic_get_section_contents): Don't call bfd_get_file_size. Check archive element size. (_bfd_generic_get_section_contents_in_window): Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 561ac1b3521..ad9eecb4b76 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2017-06-28 H.J. Lu + + * libbfd.c (_bfd_generic_get_section_contents): Don't call + bfd_get_file_size. Check archive element size. + (_bfd_generic_get_section_contents_in_window): Likewise. + 2017-06-28 H.J. Lu * bfd-in2.h: Regenerated. diff --git a/bfd/libbfd.c b/bfd/libbfd.c index 0d9de2b30bd..2a49b61d2b4 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -789,7 +789,6 @@ _bfd_generic_get_section_contents (bfd *abfd, bfd_size_type count) { bfd_size_type sz; - ufile_ptr filesz; if (count == 0) return TRUE; @@ -812,10 +811,12 @@ _bfd_generic_get_section_contents (bfd *abfd, sz = section->rawsize; else sz = section->size; - filesz = bfd_get_file_size (abfd); if (offset + count < count || offset + count > sz - || (ufile_ptr) section->filepos + offset + count > filesz) + || (abfd->my_archive != NULL + && !bfd_is_thin_archive (abfd->my_archive) + && ((ufile_ptr) section->filepos + offset + count + > arelt_size (abfd)))) { bfd_set_error (bfd_error_invalid_operation); return FALSE; @@ -838,7 +839,6 @@ _bfd_generic_get_section_contents_in_window { #ifdef USE_MMAP bfd_size_type sz; - ufile_ptr filesz; if (count == 0) return TRUE; @@ -871,9 +871,12 @@ _bfd_generic_get_section_contents_in_window sz = section->rawsize; else sz = section->size; - filesz = bfd_get_file_size (abfd); - if (offset + count > sz - || (ufile_ptr) section->filepos + offset + count > filesz + if (offset + count < count + || offset + count > sz + || (abfd->my_archive != NULL + && !bfd_is_thin_archive (abfd->my_archive) + && ((ufile_ptr) section->filepos + offset + count + > arelt_size (abfd))) || ! bfd_get_file_window (abfd, section->filepos + offset, count, w, TRUE)) return FALSE;