123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- --- a/squashfs-tools/squashfs_fs.h
- +++ b/squashfs-tools/squashfs_fs.h
- @@ -30,6 +30,13 @@
- #define SQUASHFS_MAGIC_SWAP 0x68737173
- #define SQUASHFS_START 0
-
- +/*
- + * Squashfs + LZMA
- + */
- +
- +#define SQUASHFS_MAGIC_LZMA 0x71736873
- +#define SQUASHFS_MAGIC_LZMA_SWAP 0x73687371
- +
- /* size of metadata (inode and directory) blocks */
- #define SQUASHFS_METADATA_SIZE 8192
- #define SQUASHFS_METADATA_LOG 13
- --- a/squashfs-tools/unsquashfs.c
- +++ b/squashfs-tools/unsquashfs.c
- @@ -1463,10 +1463,12 @@ int read_super(char *source)
- */
- read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block),
- &sBlk_4);
- - swap = sBlk_4.s_magic != SQUASHFS_MAGIC;
- + swap = (sBlk_4.s_magic != SQUASHFS_MAGIC &&
- + sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA);
- SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4);
-
- - if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 &&
- + if((sBlk_4.s_magic == SQUASHFS_MAGIC ||
- + sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 &&
- sBlk_4.s_minor == 0) {
- s_ops.squashfs_opendir = squashfs_opendir_4;
- s_ops.read_fragment = read_fragment_4;
- @@ -1479,7 +1481,11 @@ int read_super(char *source)
- /*
- * Check the compression type
- */
- - comp = lookup_compressor_id(sBlk.s.compression);
- + if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA)
- + comp = lookup_compressor("lzma");
- + else
- + comp = lookup_compressor_id(sBlk.s.compression);
- +
- return TRUE;
- }
-
- @@ -1494,8 +1500,10 @@ int read_super(char *source)
- * Check it is a SQUASHFS superblock
- */
- swap = 0;
- - if(sBlk_3.s_magic != SQUASHFS_MAGIC) {
- - if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) {
- + if(sBlk_3.s_magic != SQUASHFS_MAGIC &&
- + sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) {
- + if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP ||
- + sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) {
- squashfs_super_block_3 sblk;
- ERROR("Reading a different endian SQUASHFS filesystem "
- "on %s\n", source);
- @@ -1573,7 +1581,11 @@ int read_super(char *source)
- /*
- * 1.x, 2.x and 3.x filesystems use gzip compression.
- */
- - comp = lookup_compressor("gzip");
- + if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA)
- + comp = lookup_compressor("lzma");
- + else
- + comp = lookup_compressor("gzip");
- +
- return TRUE;
-
- failed_mount:
|