[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug-tar] [PATCH] Deterministic archive type detection
From: |
Pavel Raiskup |
Subject: |
[Bug-tar] [PATCH] Deterministic archive type detection |
Date: |
Thu, 30 Mar 2017 14:05:07 +0200 |
Heuristic for guessing the archive/compression format works with
archive magic and tar_checksum() which depends on the first block
(BLOCKSIZE) of archive data in pre-fetched buffer.
Very small files though (compressed size is smaller than
BLOCKSIZE) don't initialize a whole data block in buffer, so the
heuristic calculated with uninitialized data previously. In rare
situations compressed archives were marked as non-compressed,
which in turn caused extraction failure.
* src/buffer.c (check_compressed_archive): Don't assume archives
smaller than BLOCKSIZE could be non-compressed, as tar header has
always has at least one block.
---
src/buffer.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/buffer.c b/src/buffer.c
index fb34834..f064d2a 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -391,10 +391,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;
--
2.9.3
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Bug-tar] [PATCH] Deterministic archive type detection,
Pavel Raiskup <=