summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2023-02-21 13:57:36 +0200
committerSergey Poznyakoff <gray@gnu.org>2023-02-21 14:00:32 +0200
commit4177c98bcc4ce4c89e50ff7d60d3e5662754b140 (patch)
tree63323cfcd93b1853f48986f78f58a7ef5676fbb5
parent5e8a915b16c5f06d2a16d98cdc2af666199caabb (diff)
downloadtar-4177c98bcc4ce4c89e50ff7d60d3e5662754b140.tar.gz
Detect EOF when deleting from archive.
See https://savannah.gnu.org/bugs/?63823 * src/delete.c (flush_file): Break the loop on EOF. * tests/delete06.at: New test. * tests/Makefile.am: Add new test. * tests/testsuite.at: Likewise.
-rw-r--r--src/delete.c3
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/delete06.at42
-rw-r--r--tests/testsuite.at1
4 files changed, 47 insertions, 0 deletions
diff --git a/src/delete.c b/src/delete.c
index 728af735..fe89eb6e 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -149,6 +149,9 @@ flush_file (void)
{
blocks_to_skip -= (record_end - current_block);
flush_archive ();
+ if (record_end == current_block)
+ /* Hit EOF */
+ break;
}
current_block += blocks_to_skip;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 230e74c9..d42782be 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -81,6 +81,7 @@ TESTSUITE_AT = \
delete03.at\
delete04.at\
delete05.at\
+ delete06.at\
difflink.at\
exclude.at\
exclude01.at\
diff --git a/tests/delete06.at b/tests/delete06.at
new file mode 100644
index 00000000..9668a28c
--- /dev/null
+++ b/tests/delete06.at
@@ -0,0 +1,42 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright 2023 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/>.
+
+# When deleting last partially written member from a truncated archive
+# tar 1.34 would miss EOF and spin in a dead loop in delete.c:flush_file.
+# References: https://savannah.gnu.org/bugs/?63823
+
+AT_SETUP([EOF detection])
+AT_KEYWORDS([delete delete06])
+
+AT_TAR_CHECK([
+mkdir b
+touch a b/1 c
+tar -cf archive.tar a b/1 c
+case $TEST_TAR_FORMAT in
+gnu) size=1500;;
+pax) size=3072;;
+esac
+dd if=archive.tar of=trunc.tar bs=$size count=1 2>/dev/null
+tar --delete 'b/' -f trunc.tar
+],
+[0],
+[],[],[],[],[gnu, pax])
+
+AT_CLEANUP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 07560284..995f6129 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -320,6 +320,7 @@ m4_include([delete02.at])
m4_include([delete03.at])
m4_include([delete04.at])
m4_include([delete05.at])
+m4_include([delete06.at])
AT_BANNER([Extracting])
m4_include([extrac01.at])