[binutils-gdb] bfd_stat_arch_elt buffer overflow

Alan Modra amodra@sourceware.org
Thu Feb 27 06:37:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ff69a8949bb65c9eb64ea03ee1492902c2620c8c

commit ff69a8949bb65c9eb64ea03ee1492902c2620c8c
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Feb 27 13:50:21 2020 +1030

    bfd_stat_arch_elt buffer overflow
    
    If you manage to put an xcoff object file into a non-xcoff archive
    (created by first putting a non-xcoff object file into it), and have
    xcoff support compiled into libbfd, then objdump -x on the archive
    can segfault.  The problem is that _bfd_xcoff_stat_arch_elt expects
    abfd->arelt_data->arch_header to be one of the xcoff variants, but
    arelt_data is generated depending on the archive format, *not* the
    element format.
    
    	* bfd.c (bfd_stat_arch_elt): Use vector of containing archive,
    	if file is an archive element.
    	* bfd-in2.h: Regenerate.

Diff:
---
 bfd/ChangeLog | 6 ++++++
 bfd/bfd-in2.h | 3 ++-
 bfd/bfd.c     | 3 ++-
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f0b7a4a..ff03baa 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-27  Alan Modra  <amodra@gmail.com>
+
+	* bfd.c (bfd_stat_arch_elt): Use vector of containing archive,
+	if file is an archive element.
+	* bfd-in2.h: Regenerate.
+
 2020-02-26  Alan Modra  <amodra@gmail.com>
 
 	* archive.c (do_slurp_bsd_armap): Increase minimum parsed_size, and
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 2d56fda..44bc704 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -7121,7 +7121,8 @@ bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
        BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
 
 #define bfd_stat_arch_elt(abfd, stat) \
-       BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
+       BFD_SEND (abfd->my_archive ? abfd->my_archive : abfd, \
+                 _bfd_stat_arch_elt, (abfd, stat))
 
 #define bfd_update_armap_timestamp(abfd) \
        BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 463f94b..1c1238c 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -2063,7 +2063,8 @@ DESCRIPTION
 .	BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
 .
 .#define bfd_stat_arch_elt(abfd, stat) \
-.	BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
+.	BFD_SEND (abfd->my_archive ? abfd->my_archive : abfd, \
+.		  _bfd_stat_arch_elt, (abfd, stat))
 .
 .#define bfd_update_armap_timestamp(abfd) \
 .	BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))



More information about the Binutils-cvs mailing list