Re: Fuzzed files in archives
authorAlan Modra <amodra@gmail.com>
Wed, 9 Nov 2022 06:07:42 +0000 (16:37 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 9 Nov 2022 07:01:41 +0000 (17:31 +1030)
Like commit ffbe89531c2e this avoids more silliness writing output
that is going to be deleted.  bfd_close and bfd_close_all_done differ
in that only the former calls _bfd_write_contents.

* objcopy.c (copy_archive): Don't call bfd_close for elements
that are going to be deleted, call bfd_close_all_done instead.
Do the same for the archive itself.

binutils/objcopy.c

index 03350babb69c7c757029b1ad83a2987fadcb6460..d886e3ae343a659273648d589b231ac5210adbc5 100644 (file)
@@ -3670,23 +3670,16 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
          if (del && bfd_get_arch (this_element) == bfd_arch_unknown)
            /* Try again as an unknown object file.  */
            ok_object = false;
-         else if (!bfd_close (output_bfd))
-           {
-             bfd_nonfatal_message (output_name, NULL, NULL, NULL);
-             /* Error in new object file. Don't change archive.  */
-             status = 1;
-           }
        }
 
       if (!ok_object)
+       del = !copy_unknown_object (this_element, output_bfd);
+
+      if (!(ok_object && !del ? bfd_close : bfd_close_all_done) (output_bfd))
        {
-         del = !copy_unknown_object (this_element, output_bfd);
-         if (!bfd_close_all_done (output_bfd))
-           {
-             bfd_nonfatal_message (output_name, NULL, NULL, NULL);
-             /* Error in new object file. Don't change archive.  */
-             status = 1;
-           }
+         bfd_nonfatal_message (output_name, NULL, NULL, NULL);
+         /* Error in new object file. Don't change archive.  */
+         status = 1;
        }
 
       if (del)
@@ -3717,7 +3710,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
   *ptr = NULL;
 
   filename = bfd_get_filename (obfd);
-  if (!bfd_close (obfd))
+  if (!(status == 0 ? bfd_close : bfd_close_all_done) (obfd))
     {
       status = 1;
       bfd_nonfatal_message (filename, NULL, NULL, NULL);