]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Detect EOF when deleting from archive.
authorSergey Poznyakoff <gray@gnu.org>
Tue, 21 Feb 2023 11:57:36 +0000 (13:57 +0200)
committerSergey Poznyakoff <gray@gnu.org>
Tue, 21 Feb 2023 12:00:32 +0000 (14:00 +0200)
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.

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

index 728af73523f0d895492fdac8e57b913dd4c328e5..fe89eb6e73dbf1a35773bcac8e2caf2b8054839a 100644 (file)
@@ -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;
 }
index 230e74c9258bd6b6185d0b7e979489cbe6aa467a..d42782be64db6b1bbf50f7caf0e786f6f9cf599f 100644 (file)
@@ -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 (file)
index 0000000..9668a28
--- /dev/null
@@ -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
index 0756028499156762235ebac5aa0f99bdecf0feba..995f61299ff6f390932628f2f256adfb06bbda7a 100644 (file)
@@ -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])