Fix non-deterministic archive type detection
Due to analysis of partly uninitialized read-ahead buffer (short_read call), we sometimes mistakenly classified very small compressed archives as non-compressed; which in turn caused extraction failure. * src/buffer.c (check_compressed_archive): Don't assume that archives smaller than BLOCKSIZE could be non-compressed, as tar header always has at least one block.
This commit is contained in:
committed by
Sergey Poznyakoff
parent
8b9026f3ae
commit
1e8b786e65
10
src/buffer.c
10
src/buffer.c
@@ -402,10 +402,12 @@ check_compressed_archive (bool *pshort)
|
||||
/* Restore global values */
|
||||
read_full_records = sfr;
|
||||
|
||||
if ((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)
|
||||
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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user