diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c index cd8df086e..bdbd39ac2 100644 --- a/archival/libunarchive/decompress_bunzip2.c +++ b/archival/libunarchive/decompress_bunzip2.c @@ -692,9 +692,9 @@ unpack_bz2_stream(int src_fd, int dst_fd) IF_DESKTOP(long long) int FAST_FUNC unpack_bz2_stream_prime(int src_fd, int dst_fd) { - unsigned char magic[2]; - xread(src_fd, magic, 2); - if (magic[0] != 'B' || magic[1] != 'Z') { + uint16_t magic2; + xread(src_fd, &magic2, 2); + if (magic2 != BZIP2_MAGIC) { bb_error_msg_and_die("invalid magic"); } return unpack_bz2_stream(src_fd, dst_fd); 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: