Michał Górny <mgo...@gentoo.org> ha escrit: > FWICS the problem is that one of the checksum variants evaluates to zero > and tar is rather lax on accepting null checksum string (with trailing > garbage) as zero.
That's easy to fix (see the attached patch). I'm not quite convinced that it doesn't break backward compatibility though (can such headers be found in some old archives?) Regards, Sergey diff --git a/src/buffer.c b/src/buffer.c index ddb63cc..5632aee 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -406,10 +406,6 @@ check_compressed_archive (bool *pshort) read_full_records = sfr; if (record_start != record_end /* no files smaller than BLOCKSIZE */ - && (strcmp (record_start->header.magic, TMAGIC) == 0 - || strcmp (record_start->buffer + offsetof (struct posix_header, - magic), - OLDGNU_MAGIC) == 0) && tar_checksum (record_start, true) == HEADER_SUCCESS) /* Probably a valid header */ return ct_tar; diff --git a/src/list.c b/src/list.c index ba9c306..0dacbb7 100644 --- a/src/list.c +++ b/src/list.c @@ -892,6 +892,11 @@ from_header (char const *where0, size_t digs, char const *type, value = -value; } + /* Skip consecutive \0's. This ensures the test below will catch eventual + trailing garbage */ + while (where < lim && !*where) + where++; + if (where != lim && *where && !isspace ((unsigned char) *where)) { if (type)