]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
close last arfile before processing current arfile
authorAlan Modra <amodra@gmail.com>
Mon, 9 Dec 2024 10:08:58 +0000 (20:38 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 12 Dec 2024 05:34:51 +0000 (16:04 +1030)
This also reduces peak memory a little.

* dlltool.c (identify_search_archive): Close last_arfile earlier.
Report an error if bfd_openr_next_archived_file returns the same
bfd.  Localise variables.
* nm.c (display_archive): Likewise.
* objdump.c (display_any_bfd): Likewise.
* size.c (display_archive): Likewise.

binutils/dlltool.c
binutils/nm.c
binutils/objdump.c
binutils/size.c

index 17e9416a7f1eedfdf4acc69dda8a3458504164dd..990082d3b441364e452108dd82894b872f022693 100644 (file)
@@ -3322,21 +3322,25 @@ identify_search_archive (bfd * abfd,
                         void (* operation) (bfd *, bfd *, void *),
                         void * user_storage)
 {
-  bfd *   arfile = NULL;
-  bfd *   last_arfile = NULL;
-  char ** matching;
+  bfd *last_arfile = NULL;
 
   while (1)
     {
-      arfile = bfd_openr_next_archived_file (abfd, arfile);
-
-      if (arfile == NULL)
+      bfd *arfile = bfd_openr_next_archived_file (abfd, last_arfile);
+      if (arfile == NULL
+         || arfile == last_arfile)
        {
+         if (arfile != NULL)
+           bfd_set_error (bfd_error_malformed_archive);
          if (bfd_get_error () != bfd_error_no_more_archived_files)
            bfd_fatal (bfd_get_filename (abfd));
          break;
        }
 
+      if (last_arfile != NULL)
+       bfd_close (last_arfile);
+
+      char **matching;
       if (bfd_check_format_matches (arfile, bfd_object, &matching))
        (*operation) (arfile, abfd, user_storage);
       else
@@ -3345,24 +3349,11 @@ identify_search_archive (bfd * abfd,
          free (matching);
        }
 
-      if (last_arfile != NULL)
-       {
-         bfd_close (last_arfile);
-         /* PR 17512: file: 8b2168d4.  */
-         if (last_arfile == arfile)
-           {
-             last_arfile = NULL;
-             break;
-           }
-       }
-
       last_arfile = arfile;
     }
 
   if (last_arfile != NULL)
-    {
-      bfd_close (last_arfile);
-    }
+    bfd_close (last_arfile);
 }
 
 /* Call the identify_search_section() function for each section of this
index 87e8305b3f8cfad7b27afc44cec78137a4018fc5..aabaea46f2aa88130c01c6af67c8518ea8368681 100644 (file)
@@ -1566,26 +1566,29 @@ set_print_format (bfd *file)
 static void
 display_archive (bfd *file)
 {
-  bfd *arfile = NULL;
-  bfd *last_arfile = NULL;
-  char **matching;
-
   format->print_archive_filename (bfd_get_filename (file));
 
   if (print_armap)
     print_symdef_entry (file);
 
+  bfd *last_arfile = NULL;
   for (;;)
     {
-      arfile = bfd_openr_next_archived_file (file, arfile);
-
-      if (arfile == NULL)
+      bfd *arfile = bfd_openr_next_archived_file (file, last_arfile);
+      if (arfile == NULL
+         || arfile == last_arfile)
        {
+         if (arfile != NULL)
+           bfd_set_error (bfd_error_malformed_archive);
          if (bfd_get_error () != bfd_error_no_more_archived_files)
            bfd_nonfatal (bfd_get_filename (file));
          break;
        }
 
+      if (last_arfile != NULL)
+       bfd_close (last_arfile);
+
+      char **matching;
       if (bfd_check_format_matches (arfile, bfd_object, &matching))
        {
          set_print_format (arfile);
@@ -1600,12 +1603,6 @@ display_archive (bfd *file)
            list_matching_formats (matching);
        }
 
-      if (last_arfile != NULL)
-       {
-         bfd_close (last_arfile);
-         if (arfile == last_arfile)
-           return;
-       }
       last_arfile = arfile;
     }
 
index 4980929d6abb71a9119e3833da77969a83e63a8f..f409d6798313c9088cf2aa7337a86f5e95f3f2f5 100644 (file)
@@ -5888,9 +5888,6 @@ display_any_bfd (bfd *file, int level)
   /* If the file is an archive, process all of its elements.  */
   if (bfd_check_format (file, bfd_archive))
     {
-      bfd *arfile = NULL;
-      bfd *last_arfile = NULL;
-
       if (level == 0)
        printf (_("In archive %s:\n"), sanitize_string (bfd_get_filename (file)));
       else if (level > 100)
@@ -5905,30 +5902,25 @@ display_any_bfd (bfd *file, int level)
        printf (_("In nested archive %s:\n"),
                sanitize_string (bfd_get_filename (file)));
 
+      bfd *last_arfile = NULL;
       for (;;)
        {
-         bfd_set_error (bfd_error_no_error);
-
-         arfile = bfd_openr_next_archived_file (file, arfile);
-         if (arfile == NULL)
+         bfd *arfile = bfd_openr_next_archived_file (file, last_arfile);
+         if (arfile == NULL
+             || arfile == last_arfile)
            {
+             if (arfile != NULL)
+               bfd_set_error (bfd_error_malformed_archive);
              if (bfd_get_error () != bfd_error_no_more_archived_files)
                my_bfd_nonfatal (bfd_get_filename (file));
              break;
            }
 
+         if (last_arfile != NULL)
+           bfd_close (last_arfile);
+
          display_any_bfd (arfile, level + 1);
 
-         if (last_arfile != NULL)
-           {
-             bfd_close (last_arfile);
-             /* PR 17512: file: ac585d01.  */
-             if (arfile == last_arfile)
-               {
-                 last_arfile = NULL;
-                 break;
-               }
-           }
          last_arfile = arfile;
        }
 
index df0ede0c7282437dac6b58e4a2fb1160ccd30fa6..ff3db5b57c25ffce49bf661fb676ac80cb274c8d 100644 (file)
@@ -368,16 +368,15 @@ display_bfd (bfd *abfd)
 static void
 display_archive (bfd *file)
 {
-  bfd *arfile = (bfd *) NULL;
-  bfd *last_arfile = (bfd *) NULL;
-
+  bfd *last_arfile = NULL;
   for (;;)
     {
-      bfd_set_error (bfd_error_no_error);
-
-      arfile = bfd_openr_next_archived_file (file, arfile);
-      if (arfile == NULL)
+      bfd *arfile = bfd_openr_next_archived_file (file, last_arfile);
+      if (arfile == NULL
+         || arfile == last_arfile)
        {
+         if (arfile != NULL)
+           bfd_set_error (bfd_error_malformed_archive);
          if (bfd_get_error () != bfd_error_no_more_archived_files)
            {
              bfd_nonfatal (bfd_get_filename (file));
@@ -386,17 +385,10 @@ display_archive (bfd *file)
          break;
        }
 
-      display_bfd (arfile);
-
       if (last_arfile != NULL)
-       {
-         bfd_close (last_arfile);
-
-         /* PR 17512: file: a244edbc.  */
-         if (last_arfile == arfile)
-           return;
-       }
+       bfd_close (last_arfile);
 
+      display_bfd (arfile);
       last_arfile = arfile;
     }