PR28391, strip/objcopy --preserve-dates *.a: cannot set time
authorGleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
Tue, 28 Sep 2021 10:41:26 +0000 (20:11 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 28 Sep 2021 10:48:48 +0000 (20:18 +0930)
After commit 985e0264516 copy_archive function began to pass invalid
values to the utimensat(2) function when it tries to preserve
timestamps in ar archives.  This happens because the bfd_stat_arch_elt
implementation for ar archives fills only the st_mtim.tv_sec part of
the st_mtim timespec structure, but leaves the st_mtim.tv_nsec part
and the whole st_atim timespec untouched leaving them uninitialized

PR 28391
* ar.c (extract_file): Clear buf for preserve_dates.
* objcopy.c (copy_archive): Likewise.

binutils/ar.c
binutils/objcopy.c

index 5d6976c7027dcd90b5a2c3afc0b87bbe39306365..8885585ef7537450f0f0990a5eeea7eb16bcad8f 100644 (file)
@@ -1180,6 +1180,9 @@ extract_file (bfd *abfd)
   bfd_size_type size;
   struct stat buf;
 
+  if (preserve_dates)
+    memset (&buf, 0, sizeof (buf));
+
   if (bfd_stat_arch_elt (abfd, &buf) != 0)
     /* xgettext:c-format */
     fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
index a6c2e0dcc26a497c5de4710e476bb5a4cecbfede..fd7557fe4335b9b876fbdc59d884ade9437e7796 100644 (file)
@@ -3600,6 +3600,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
 
       if (preserve_dates)
        {
+         memset (&buf, 0, sizeof (buf));
          stat_status = bfd_stat_arch_elt (this_element, &buf);
 
          if (stat_status != 0)