]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Fix spurious diagnostic during extraction of . with --keep-newer-files
authorSergey Poznyakoff <gray@gnu.org>
Wed, 5 Jun 2024 15:19:10 +0000 (18:19 +0300)
committerSergey Poznyakoff <gray@gnu.org>
Wed, 5 Jun 2024 15:19:10 +0000 (18:19 +0300)
Bug reported in https://savannah.gnu.org/bugs/?65838.

Bug introduced by 79d1ac38c1.

* src/extract.c (make_directories): Restore second argument.  This
reverts the change made in 79d1ac38c1.
(maybe_recoverable, rename_directory): Update calls to make_directories.
* tests/extrac27.at: New file.
* tests/Makefile.am: Add new test.
* tests/testsuite.at: Likewise.

src/extract.c
tests/Makefile.am
tests/extrac27.at [new file with mode: 0644]
tests/testsuite.at

index 0fef056225521f5f9c1b91c6ed0b61d292b6c7d9..41f8418fb50556a03eff0bfb88dff36baeb2975c 100644 (file)
@@ -709,9 +709,9 @@ fixup_delayed_set_stat (char const *src, char const *dst)
 /* After a file/link/directory creation has failed due to ENOENT,
    create all required directories.  Return zero if all the required
    directories were created, nonzero (issuing a diagnostic) otherwise.
-   Set *INTERDIR_MADE if at least one directory was created.  */
+   Set *INTERDIR_MADE (unless NULL) if at least one directory was created. */
 static int
-make_directories (char *file_name)
+make_directories (char *file_name, bool *interdir_made)
 {
   char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
   char *cursor;                        /* points into the file name */
@@ -753,7 +753,8 @@ make_directories (char *file_name)
          delay_set_stat (file_name,
                          0, mode & ~ current_umask, MODE_RWX,
                          desired_mode, AT_SYMLINK_NOFOLLOW);
-
+         if (interdir_made)
+           *interdir_made = true;
          print_for_mkdir (file_name, desired_mode);
          parent_end = NULL;
        }
@@ -793,6 +794,9 @@ make_directories (char *file_name)
       errno = parent_errno;
       mkdir_error (file_name);
     }
+  else if (interdir_made)
+    *interdir_made = true;
+
   *parent_end = '/';
 
   return stat_status;
@@ -910,11 +914,8 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
 
     case ENOENT:
       /* Attempt creating missing intermediate directories. */
-      if (make_directories (file_name) == 0)
-       {
-         *interdir_made = true;
-         return RECOVER_OK;
-       }
+      if (make_directories (file_name, interdir_made) == 0 && *interdir_made)
+       return RECOVER_OK;
       break;
 
     default:
@@ -2011,7 +2012,7 @@ rename_directory (char *src, char *dst)
       switch (e)
        {
        case ENOENT:
-         if (make_directories (dst) == 0)
+         if (make_directories (dst, NULL) == 0)
            {
              if (renameat (chdir_fd, src, chdir_fd, dst) == 0)
                return true;
index 5745f69c48d384acc7309702f5784269f03525ce..5b890b7c5770a27add829c0dca10262d53f3ebe9 100644 (file)
@@ -136,6 +136,7 @@ TESTSUITE_AT = \
  extrac24.at\
  extrac25.at\
  extrac26.at\
+ extrac27.at\
  filerem01.at\
  filerem02.at\
  grow.at\
diff --git a/tests/extrac27.at b/tests/extrac27.at
new file mode 100644 (file)
index 0000000..1992d1b
--- /dev/null
@@ -0,0 +1,46 @@
+# Test suite for GNU tar.                             -*- autotest -*-
+# Copyright 2024 Free Software Foundation, Inc.
+#
+# This file is part of GNU tar.
+#
+# GNU tar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU tar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Description: When called with --keep-newer-files, tar 1.35 issued
+# spurious diagnostic message:
+#
+#   Unexpected inconsistency when making directory.
+#
+# during extraction of ".".
+#
+# References: https://savannah.gnu.org/bugs/?65838
+
+AT_SETUP([extract current dir with --keep-newer-files])
+AT_KEYWORDS([extract extrac27])
+AT_TAR_CHECK([
+mkdir dir
+touch dir/file
+tar cf a.tar -C dir .
+
+mkdir ext
+tar xv --keep-newer-files -f a.tar -C ext
+],
+[0],
+[./
+./file
+])
+AT_CLEANUP
+
+
+
+
index 8a0d39c31a3ef4b6fe0687bd677f6f5ab3e5cc8a..33227ef457a586d9f5db6fa01d710b232df4c63a 100644 (file)
@@ -353,6 +353,7 @@ m4_include([extrac23.at])
 m4_include([extrac24.at])
 m4_include([extrac25.at])
 m4_include([extrac26.at])
+m4_include([extrac27.at])
 
 m4_include([backup01.at])