summaryrefslogtreecommitdiffhomepage
path: root/archival/libunarchive/get_header_tar.c
diff options
context:
space:
mode:
Diffstat (limited to 'archival/libunarchive/get_header_tar.c')
-rw-r--r--archival/libunarchive/get_header_tar.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index 21bbc9715..d5c92359c 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -196,27 +196,30 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
) {
#if ENABLE_FEATURE_TAR_AUTODETECT
char FAST_FUNC (*get_header_ptr)(archive_handle_t *);
+ uint16_t magic2;
autodetect:
+ magic2 = *(uint16_t*)tar.name;
/* tar gz/bz autodetect: check for gz/bz2 magic.
* If we see the magic, and it is the very first block,
* we can switch to get_header_tar_gz/bz2/lzma().
* Needs seekable fd. I wish recv(MSG_PEEK) works
* on any fd... */
# if ENABLE_FEATURE_SEAMLESS_GZ
- if (tar.name[0] == 0x1f && tar.name[1] == (char)0x8b) { /* gzip */
+ if (magic2 == GZIP_MAGIC) {
get_header_ptr = get_header_tar_gz;
} else
# endif
# if ENABLE_FEATURE_SEAMLESS_BZ2
- if (tar.name[0] == 'B' && tar.name[1] == 'Z'
+ if (magic2 == BZIP2_MAGIC
&& tar.name[2] == 'h' && isdigit(tar.name[3])
) { /* bzip2 */
get_header_ptr = get_header_tar_bz2;
} else
# endif
# if ENABLE_FEATURE_SEAMLESS_XZ
- //TODO
+ //TODO: if (magic2 == XZ_MAGIC1)...
+ //else
# endif
goto err;
/* Two different causes for lseek() != 0: