--- tar.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tar.c b/tar.c index d3a9f3b..92fe61b 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_@ -411,6 +419,7 @@ chktar(struct header *h) char tmp[8], *err, *p = (char *)h; const char *reason; long s1, s2, i; + int leading; if (h->prefix[0] == '\0' && h->name[0] == '\0') { reason = "empty filename"; _AT_@ -421,9 +430,11 @@ chktar(struct header *h) goto bad; } memcpy(tmp, h->chksum, sizeof(tmp)); - for (i = 0; i < sizeof(tmp); i++) + for (leading = 1, i = 0; i < sizeof(tmp); i++) if (tmp[i] == ' ') - tmp[i] = '\0'; + tmp[i] = leading ? '0' : '\0'; + else + leading = 0; s1 = strtol(tmp, &err, 8); if (s1 < 0 || *err != '\0') { reason = "invalid checksum"; -- 2.43.0Received on Sat Feb 10 2024 - 23:57:38 CET
This archive was generated by hypermail 2.3.0 : Sun Feb 11 2024 - 00:00:51 CET