aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2019-05-19 23:18:26 -0500
committerRob Landley <rob@landley.net>2019-05-19 23:18:26 -0500
commite6460141851d3af158eefe9ade4cff75017e3a87 (patch)
treeb339242876f65cfc0d099f347c779402e560be6c
parent6534204a7ac32fe8009d0d14189dfa86826b14a5 (diff)
downloadtoybox-e6460141851d3af158eefe9ade4cff75017e3a87.tar.gz
Fix tar sparse extract with extension blocks.
-rw-r--r--tests/tar.test1
-rw-r--r--toys/posix/tar.c9
2 files changed, 3 insertions, 7 deletions
diff --git a/tests/tar.test b/tests/tar.test
index b70bf3cd..2046e51a 100644
--- a/tests/tar.test
+++ b/tests/tar.test
@@ -220,7 +220,6 @@ BLOCKS=7 testing "sparse double overflow" "$TAR --sparse fweep | $SUM" \
tar c --sparse fweep > fweep.tar
FWEEP=$(du fweep)
-exit 1
rm fweep
testing "sparse extract" "tar xf fweep.tar && du fweep" "$FWEEP\n" "" ""
rm fweep fweep.tar
diff --git a/toys/posix/tar.c b/toys/posix/tar.c
index ecc378b7..10535f37 100644
--- a/toys/posix/tar.c
+++ b/toys/posix/tar.c
@@ -439,7 +439,7 @@ static void sendfile_sparse(int fd)
long long len, used = 0, sent;
int i = 0, j;
- for (;;) {
+ do {
if (TT.sparselen) {
if (!TT.sparse[i*2+1]) continue;
// Seek past holes or fill output with zeroes.
@@ -465,9 +465,7 @@ error:
break;
}
-
- if (++i >= TT.sparselen) break;
- }
+ } while (++i<TT.sparselen);
close(fd);
}
@@ -635,10 +633,9 @@ static void unpack_tar(struct tar_hdr *first)
if (++i>max || !*s) {
if (!(*sparse ? sparse[504] : ((char *)&tar)[482])) break;
xreadall(TT.fd, s = sparse, 512);
- max = 42;
+ max = 41;
i = 0;
}
-
// Load next entry
TT.sparse[TT.sparselen++] = otoi(s, 12);
s += 12;