--- tar.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tar.c b/tar.c index d3a9f3b..9833ae0 100644 --- a/tar.c +++ b/tar.c _AT_@ -382,6 +382,7 @@ static void sanitize(struct header *h) { size_t i, j; + int leading; struct { char *f; size_t l; _AT_@ -399,10 +400,17 @@ sanitize(struct header *h) /* Numeric fields can be terminated with spaces instead of * NULs as per the ustar specification. Patch all of them to * use NULs so we can perform string operations on them. */ + + /* Most tar implementations also recognize leading spaces + * in numeric fields. Some tar archives use ' 's instead of + * '0's for them. So patch those too, so we can correctly + * recognize them. */ for (i = 0; i < LEN(fields); i++) - for (j = 0; j < fields[i].l; j++) + for (leading = 1, j = 0; j < fields[i].l; j++) if (fields[i].f[j] == ' ') - fields[i].f[j] = '\0'; + fields[i].f[j] = leading ? '0' : '\0'; + else + leading = 0; } static void _AT_@ -454,8 +462,8 @@ xt(int argc, char *argv[], int mode) int (*fn)(char *, ssize_t, char[BLKSIZ]) = (mode == 'x') ? unarchive : print; while (eread(tarfd, b, BLKSIZ) > 0 && h->name[0]) { - chktar(h); - sanitize(h), n = 0; + sanitize(h); + chktar(h), n = 0; /* small dance around non-null terminated fields */ if (h->prefix[0]) -- 2.43.0Received on Sat Feb 10 2024 - 21:02:05 CET
This archive was generated by hypermail 2.3.0 : Sat Feb 10 2024 - 21:12:32 CET