|
|
@@ -0,0 +1,72 @@
|
|
|
+--- 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:
|