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.
/* 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;