1 --- a/squashfs-tools/squashfs_fs.h
2 +++ b/squashfs-tools/squashfs_fs.h
4 #define SQUASHFS_MAGIC_SWAP 0x68737173
5 #define SQUASHFS_START 0
11 +#define SQUASHFS_MAGIC_LZMA 0x71736873
12 +#define SQUASHFS_MAGIC_LZMA_SWAP 0x73687371
14 /* size of metadata (inode and directory) blocks */
15 #define SQUASHFS_METADATA_SIZE 8192
16 #define SQUASHFS_METADATA_LOG 13
17 --- a/squashfs-tools/unsquashfs.c
18 +++ b/squashfs-tools/unsquashfs.c
19 @@ -1463,10 +1463,12 @@ int read_super(char *source)
21 read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block),
23 - swap = sBlk_4.s_magic != SQUASHFS_MAGIC;
24 + swap = (sBlk_4.s_magic != SQUASHFS_MAGIC &&
25 + sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA);
26 SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4);
28 - if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 &&
29 + if((sBlk_4.s_magic == SQUASHFS_MAGIC ||
30 + sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 &&
31 sBlk_4.s_minor == 0) {
32 s_ops.squashfs_opendir = squashfs_opendir_4;
33 s_ops.read_fragment = read_fragment_4;
34 @@ -1479,7 +1481,11 @@ int read_super(char *source)
36 * Check the compression type
38 - comp = lookup_compressor_id(sBlk.s.compression);
39 + if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA)
40 + comp = lookup_compressor("lzma");
42 + comp = lookup_compressor_id(sBlk.s.compression);
47 @@ -1494,8 +1500,10 @@ int read_super(char *source)
48 * Check it is a SQUASHFS superblock
51 - if(sBlk_3.s_magic != SQUASHFS_MAGIC) {
52 - if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) {
53 + if(sBlk_3.s_magic != SQUASHFS_MAGIC &&
54 + sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) {
55 + if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP ||
56 + sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) {
57 squashfs_super_block_3 sblk;
58 ERROR("Reading a different endian SQUASHFS filesystem "
60 @@ -1573,7 +1581,11 @@ int read_super(char *source)
62 * 1.x, 2.x and 3.x filesystems use gzip compression.
64 - comp = lookup_compressor("gzip");
65 + if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA)
66 + comp = lookup_compressor("lzma");
68 + comp = lookup_compressor("gzip");