diff -ur sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/LzmaStateDecode.c sqfs/lzma443/C/7zip/Compress/LZMA_C/LzmaStateDecode.c --- sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/LzmaStateDecode.c 2006-05-01 10:38:54.000000000 +0200 +++ sqfs/lzma443/C/7zip/Compress/LZMA_C/LzmaStateDecode.c 2007-03-16 22:00:41.000000000 +0100 @@ -142,6 +142,9 @@ } } +/* for squashfs usage */ +int squashfs_lzma_header_without_unc_size = 0; + int LzmaDecode( CLzmaDecoderState *vs, const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, @@ -235,7 +238,15 @@ int i; BufferSize -= bufferPos; if (BufferSize < 0) + { + /* This is "normal" when we don't know the uncompressed size in advance */ + if (squashfs_lzma_header_without_unc_size) + { + (*outSizeProcessed) = nowPos-1; + return LZMA_RESULT_OK; + } return LZMA_RESULT_DATA_ERROR; + } for (i = 0; i < BufferSize; i++) vs->Buffer[i] = Buffer[i]; Buffer = vs->Buffer; diff -ur sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/kmod/Makefile sqfs/lzma443/C/7zip/Compress/LZMA_C/kmod/Makefile --- sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/kmod/Makefile 2007-03-16 21:56:04.000000000 +0100 +++ sqfs/lzma443/C/7zip/Compress/LZMA_C/kmod/Makefile 2007-03-16 22:00:54.000000000 +0100 @@ -6,6 +6,6 @@ # $Id: Makefile,v 1.3 2006/11/27 03:54:58 jro Exp $ -obj-m += unlzma.o sqlzma.o +# obj-m += unlzma.o sqlzma.o unlzma-y := module.o sqlzma-y := uncomp.o diff -ur sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/makefile.gcc sqfs/lzma443/C/7zip/Compress/LZMA_C/makefile.gcc --- sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/makefile.gcc 2005-08-05 12:08:28.000000000 +0200 +++ sqfs/lzma443/C/7zip/Compress/LZMA_C/makefile.gcc 2007-03-16 22:01:54.000000000 +0100 @@ -4,18 +4,18 @@ RM = rm -f CFLAGS = -c -O2 -Wall -pedantic -D _LZMA_PROB32 -OBJS = LzmaTest.o LzmaDecode.o +OBJS = LzmaStateTest.o LzmaStateDecode.o all: $(PROG) $(PROG): $(OBJS) $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) -LzmaTest.o: LzmaTest.c - $(CXX) $(CFLAGS) LzmaTest.c +LzmaStateTest.o: LzmaStateTest.c + $(CXX) $(CFLAGS) LzmaStateTest.c -LzmaDecode.o: LzmaDecode.c - $(CXX) $(CFLAGS) LzmaDecode.c +LzmaStateDecode.o: LzmaStateDecode.c + $(CXX) $(CFLAGS) LzmaStateDecode.c clean: diff -ur sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/sqlzma.mk sqfs/lzma443/C/7zip/Compress/LZMA_C/sqlzma.mk --- sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/sqlzma.mk 2007-03-16 21:56:04.000000000 +0100 +++ sqfs/lzma443/C/7zip/Compress/LZMA_C/sqlzma.mk 2007-03-16 22:12:17.000000000 +0100 @@ -31,9 +31,9 @@ uncomp.o uncomp_r.o: CFLAGS += -I${Sqlzma} uncomp.o: uncomp.c ${Sqlzma}/sqlzma.h -libunlzma.a: uncomp.o LzmaDecode.o +libunlzma.a: uncomp.o LzmaStateDecode.o ${AR} cr $@ $^ -libunlzma_r.a: uncomp_r.o LzmaDecode_r.o +libunlzma_r.a: uncomp_r.o LzmaStateDecode_r.o ${AR} cr $@ $^ clean: clean_sqlzma diff -ur sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/uncomp.c sqfs/lzma443/C/7zip/Compress/LZMA_C/uncomp.c --- sqfs.orig/lzma443/C/7zip/Compress/LZMA_C/uncomp.c 2007-03-16 21:56:04.000000000 +0100 +++ sqfs/lzma443/C/7zip/Compress/LZMA_C/uncomp.c 2007-03-16 22:28:15.000000000 +0100 @@ -36,7 +36,7 @@ #endif /* __KERNEL__ */ #include "sqlzma.h" -#include "LzmaDecode.h" +#include "LzmaStateDecode.h" static int LzmaUncompress(struct sqlzma_un *un) { @@ -76,10 +76,34 @@ } state.Probs = (void*)sbuf->buf; - /* Read uncompressed size */ - memcpy(a, src, sizeof(a)); - src += sizeof(a); - outSize = a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24); + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + { + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + if (state.Dictionary == 0) + { + free(state.Probs); + err = -ENOMEM; + goto out; + } + } + + LzmaDecoderInit(&state); + + /* Some special squasfs versions use lzma compression without + specifying the uncompressed size in the header */ + if (squashfs_lzma_header_without_unc_size) + { + outSize = un->un_reslen; + } + else + { + /* Read uncompressed size */ + memcpy(a, src, sizeof(a)); + src += sizeof(a); + outSize = a[0] | (a[1] << 8) | (a[2] << 16) | (a[3] << 24); + } err = -EINVAL; dst = un->un_resbuf; @@ -90,9 +114,11 @@ /* Decompress */ err = LzmaDecode(&state, src, srclen, &inProcessed, dst, outSize, - &outProcessed); + &outProcessed, 1); if (err) err = -EINVAL; + if (squashfs_lzma_header_without_unc_size) + un->un_reslen = outProcessed; out: #ifndef __KERNEL__ diff -ur sqfs.orig/sqlzma.h sqfs/sqlzma.h --- sqfs.orig/sqlzma.h 2007-03-16 21:56:40.000000000 +0100 +++ sqfs/sqlzma.h 2007-03-16 22:09:18.000000000 +0100 @@ -73,6 +73,8 @@ /* ---------------------------------------------------------------------- */ +extern int squashfs_lzma_header_without_unc_size; + #ifdef __cplusplus }; #endif diff -ur sqfs.orig/squashfs3.2-r2/squashfs-tools/unsquashfs.c sqfs/squashfs3.2-r2/squashfs-tools/unsquashfs.c --- sqfs.orig/squashfs3.2-r2/squashfs-tools/unsquashfs.c 2007-03-16 21:56:27.000000000 +0100 +++ sqfs/squashfs3.2-r2/squashfs-tools/unsquashfs.c 2007-03-16 22:22:42.000000000 +0100 @@ -96,7 +96,7 @@ char *file_data; char *data; unsigned int block_size; -int lsonly = FALSE, info = FALSE, force = FALSE; +int lsonly = FALSE, info = FALSE, force = FALSE, force_lzma = FALSE; char **created_inode; int root_process; struct sqlzma_un un; @@ -1233,18 +1233,19 @@ switch (sBlk.s_magic) { squashfs_super_block sblk; case SQUASHFS_MAGIC: - un.un_lzma = 0; + un.un_lzma = force_lzma; /*FALLTHROUGH*/ case SQUASHFS_MAGIC_LZMA: break; case SQUASHFS_MAGIC_SWAP: - un.un_lzma = 0; + un.un_lzma = force_lzma; /*FALLTHROUGH*/ case SQUASHFS_MAGIC_LZMA_SWAP: ERROR("Reading a different endian SQUASHFS filesystem on %s\n", source); SQUASHFS_SWAP_SUPER_BLOCK(&sblk, &sBlk); memcpy(&sBlk, &sblk, sizeof(squashfs_super_block)); swap = 1; + break; default: ERROR("Can't find a SQUASHFS superblock on %s\n", source); goto failed_mount; @@ -1343,6 +1344,10 @@ dest = argv[i]; } else if(strcmp(argv[i], "-force") == 0 || strcmp(argv[i], "-f") == 0) force = TRUE; + else if(strcmp(argv[i], "-lzma-without-size") == 0) + squashfs_lzma_header_without_unc_size = TRUE; + else if(strcmp(argv[i], "-force-lzma") == 0) + force_lzma = TRUE; } if(i == argc) { @@ -1354,6 +1359,8 @@ ERROR("\t-l[s]\t\t\tlist filesystem only\n"); ERROR("\t-d[est] \tunsquash to , default \"squashfs-root\"\n"); ERROR("\t-f[orce]\t\tif file already exists then overwrite\n"); + ERROR("\t-lzma-without-size\tAssume lzma headers have no size in them\n"); + ERROR("\t-force-lzma\t\tAssume lzma compression independend of superblock magic\n"); } exit(1); }