Re: Fuzzed files in archives
Like commit ffbe89531c 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.
This commit is contained in:
+7
-14
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user