summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Julino <ml-julino@1und1.de>2017-04-10 16:37:39 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2017-05-29 15:59:53 +0300
commit8b9026f3ae8c03942cb9f8a3593895d5eec82b32 (patch)
tree9a609f515bedb7fd149d2ab8db0c374d702f8658
parent795877532ec98536a9a3fe2395585561c4757a67 (diff)
downloadtar-8b9026f3ae8c03942cb9f8a3593895d5eec82b32.tar.gz
Fix handling of directories removed during incremental tar run
Co-authored-by: Sergey Poznyakoff <gray@gnu.org.ua> * paxutils: Upgrade * src/create.c (create_archive): Use file_removed_diag instead of calling the corresponding *_diag function directly. * tests/dirrem01.at: New testcase. * tests/dirrem02.at: New testcase. * tests/Makefile.am: Add new tests. * tests/testsuite.at: Likewise.
m---------paxutils0
-rw-r--r--src/create.c6
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/dirrem01.at62
-rw-r--r--tests/dirrem02.at60
-rw-r--r--tests/testsuite.at4
6 files changed, 132 insertions, 2 deletions
diff --git a/paxutils b/paxutils
-Subproject ec72abd9dd63bbff4534ec77e97b1a6cadfc3cf
+Subproject d03eab65d31aa4be7682e9c0271b5793d822769
diff --git a/src/create.c b/src/create.c
index 4fbdf66d..bb720f7c 100644
--- a/src/create.c
+++ b/src/create.c
@@ -1395,13 +1395,15 @@ create_archive (void)
open_searchdir_flags);
if (fd < 0)
{
- open_diag (p->name);
+ file_removed_diag (p->name, !p->parent,
+ open_diag);
break;
}
st.fd = fd;
if (fstat (fd, &st.stat) != 0)
{
- stat_diag (p->name);
+ file_removed_diag (p->name, !p->parent,
+ stat_diag);
break;
}
st.orig_file_name = xstrdup (p->name);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 70711676..43cc88f4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -110,6 +110,8 @@ TESTSUITE_AT = \
extrac20.at\
filerem01.at\
filerem02.at\
+ dirrem01.at\
+ dirrem02.at\
gzip.at\
grow.at\
incremental.at\
diff --git a/tests/dirrem01.at b/tests/dirrem01.at
new file mode 100644
index 00000000..40344dc0
--- /dev/null
+++ b/tests/dirrem01.at
@@ -0,0 +1,62 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright 2017 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 a directory in a deep directory disappeared during creation
+# of incremental dump, tar <= 1.29 exits with TAREXIT_FAILURE (2).
+#
+# In case of files tar does not return TAREXIT_FAILURE, but instead
+# it prints a warning and exits with TAREXIT_DIFFERS.
+#
+# This test checks whether this behaviour is mimicked for directories, too.
+
+# Remark: This file is based on 'filerem01.at', which is the test-case for
+# a vanishing file.
+
+AT_SETUP([directory removed before reading])
+AT_KEYWORDS([create incremental listed dirchange dirrem dirrem01])
+
+AT_TAR_CHECK([
+mkdir dir
+mkdir dir/sub
+genfile --file dir/file1
+genfile --file dir/sub/file2
+
+case "$TEST_TAR_FORMAT" in
+posix) CPT=5;;
+gnu) CPT=3;;
+*) AT_SKIP_TEST
+esac
+
+genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \
+ tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \
+ --checkpoint-action='echo' -c -f archive.tar \
+ --listed-incremental db -v dir >/dev/null
+],
+[1],
+[ignore],
+[tar: dir: Directory is new
+tar: dir/sub: Directory is new
+tar: dir/sub: File removed before we read it
+],[],[],[gnu,posix])
+
+AT_CLEANUP
+
diff --git a/tests/dirrem02.at b/tests/dirrem02.at
new file mode 100644
index 00000000..e1cf9ef8
--- /dev/null
+++ b/tests/dirrem02.at
@@ -0,0 +1,60 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright 2017 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 an explicitley named directory disappears during creation
+# of incremental dump, tar should still exit with TAREXIT_FAILURE (2).
+#
+# For further details see dirrem01.at
+
+# Remark: This file is based on 'filerem01/02.at', which are test-cases for
+# vanishing files.
+
+AT_SETUP([explicitly named directory removed before reading])
+AT_KEYWORDS([create incremental listed dirchange dirrem dirrem02])
+
+AT_TAR_CHECK([
+mkdir dir
+mkdir dir/sub
+genfile --file dir/file1
+genfile --file dir/sub/file2
+
+case "$TEST_TAR_FORMAT" in
+posix) CPT=5;;
+gnu) CPT=3;;
+*) AT_SKIP_TEST
+esac
+
+genfile --run --checkpoint=$CPT --unlink dir/sub/file2 --unlink dir/sub -- \
+ tar --blocking-factor=1 --checkpoint=1 --checkpoint-action='sleep=1' \
+ --checkpoint-action='echo' -c -f archive.tar \
+ --listed-incremental db -v dir dir/sub >/dev/null
+],
+[2],
+[ignore],
+[tar: dir: Directory is new
+tar: dir/sub: Directory is new
+tar: dir/sub: Cannot open: No such file or directory
+tar: Exiting with failure status due to previous errors
+],[],[],[gnu,posix])
+
+AT_CLEANUP
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 8c97e34c..a2ee717d 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -339,6 +339,10 @@ AT_BANNER([Files removed while archiving])
m4_include([filerem01.at])
m4_include([filerem02.at])
+AT_BANNER([Directories removed while archiving])
+m4_include([dirrem01.at])
+m4_include([dirrem02.at])
+
AT_BANNER([Renames])
m4_include([rename01.at])
m4_include([rename02.at])