diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch b/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch new file mode 100644 index 000000000..ad69b190e --- /dev/null +++ b/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch @@ -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: | 
