[binutils-gdb] Don't use free_contents in _bfd_elf_slurp_version_tables

Alan Modra amodra@sourceware.org
Tue Dec 5 07:51:13 GMT 2023


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

commit 4cd766148361c2754c88e725779912f28651c559
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Dec 5 16:31:13 2023 +1030

    Don't use free_contents in _bfd_elf_slurp_version_tables
    
    In commit 7ac6d0c38c36 I made more use of free_contents in
    _bfd_elf_slurp_version_tables, a variable added to tag the case where
    raw verneed and verdefs have been read locally by the function, and
    thus should be freed before returning.  In retrospect it may have been
    better to do without the extra variable entirely.  It's easy to infer
    when "contents" should be freed, costing a little extra on an error
    path but costing less elsewhere.
    
            * elf.c (_bfd_elf_slurp_version_tables): Don't use free_contents.

Diff:
---
 bfd/elf.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/bfd/elf.c b/bfd/elf.c
index 08b6df5503e..db45d1a074b 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9433,7 +9433,6 @@ bool
 _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
 {
   bfd_byte *contents = NULL;
-  bool free_contents = false;
   unsigned int freeidx = 0;
   size_t amt;
 
@@ -9476,7 +9475,6 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
 	  if (contents == NULL)
 	    goto error_return_verref;
 
-	  free_contents = true;
 	  verneed_size = hdr->sh_size;
 	  verneed_count = hdr->sh_info;
 	}
@@ -9605,7 +9603,7 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
 	}
       elf_tdata (abfd)->cverrefs = i;
 
-      if (free_contents)
+      if (contents != elf_tdata (abfd)->dt_verneed)
 	free (contents);
       contents = NULL;
     }
@@ -9652,7 +9650,6 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
 	  if (contents == NULL)
 	    goto error_return_verdef;
 
-	  free_contents = true;
 	  BFD_ASSERT (sizeof (Elf_External_Verdef)
 		      >= sizeof (Elf_External_Verdaux));
 
@@ -9802,7 +9799,7 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
 		     ((bfd_byte *) everdef + iverdef->vd_next));
 	}
 
-      if (free_contents)
+      if (contents != elf_tdata (abfd)->dt_verdef)
 	free (contents);
       contents = NULL;
     }
@@ -9858,7 +9855,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
   return true;
 
  error_return:
-  if (free_contents)
+  if (contents != elf_tdata (abfd)->dt_verneed
+      && contents != elf_tdata (abfd)->dt_verdef)
     free (contents);
   return false;
 }


More information about the Binutils-cvs mailing list