[PATCH][MTD-UTILS][compr_lzo.c] Fix calls to liblzo library

Carsten Schlote c.schlote at konzeptpark.de
Mon Jan 5 15:12:30 EST 2009


This patch fixes the calls to liblzo. Some things shouldn't ever worked
before. I noticed the problem on 64bit Linux - suddently 
mkfs.jffs2 starts segfaulting.

The -t option didn't work as well.

Now LZO compression and -t option of mkfs.jffs2 is functional again.

http://www.vahanus.net/cgi-bin/gitweb.cgi?p=mtd-utils.git;a=commit;h=5cec421106993009ad43e6188ce44906138c2d38

-- 
Carsten Schlote <c.schlote at konzeptpark.de>
konzeptpark.de
-------------- next part --------------
commit 5cec421106993009ad43e6188ce44906138c2d38
Author: Carsten Schlote <c.schlote at konzeptpark.de>
Date:   Mon Jan 5 18:58:22 2009 +0100

    [PATCH][compr_lzo.c] Fix calls to LZO library
    
    Fixed the calls to LZO library. I wonder how this could ever
    work before.
    
    Now LZO compression and -t option in mkfs.jffs2 are working.
    
    Signed-off-by: Carsten Schlote <c.schlote at konzeptpark.de>

diff --git a/compr_lzo.c b/compr_lzo.c
index a0bb362..f4ae697 100644
--- a/compr_lzo.c
+++ b/compr_lzo.c
@@ -48,17 +48,19 @@ static void *lzo_compress_buf;
 static int jffs2_lzo_cmpr(unsigned char *data_in, unsigned char *cpage_out,
 			  uint32_t *sourcelen, uint32_t *dstlen, void *model)
 {
-	uint32_t compress_size;
+	lzo_uint compress_size;
 	int ret;
 
 	ret = lzo1x_999_compress(data_in, *sourcelen, lzo_compress_buf, &compress_size, lzo_mem);
 
-	if (ret != LZO_E_OK)
+	if (ret != LZO_E_OK) {
+		printf(__FILE__ ":Got compress error: ret=%d, cl=%ld, destlen=%ld\n",ret,compress_size,(long int)(*dstlen));
 		return -1;
+	}
 
 	if (compress_size > *dstlen)
 		return -1;
-
+	
 	memcpy(cpage_out, lzo_compress_buf, compress_size);
 	*dstlen = compress_size;
 
@@ -69,12 +71,15 @@ static int jffs2_lzo_decompress(unsigned char *data_in, unsigned char *cpage_out
 				 uint32_t srclen, uint32_t destlen, void *model)
 {
 	int ret;
-	uint32_t dl;
+	lzo_uint dl;
 
+	dl = destlen;
 	ret = lzo1x_decompress_safe(data_in,srclen,cpage_out,&dl,NULL);
 
-	if (ret != LZO_E_OK || dl != destlen)
+	if ((ret != LZO_E_OK) || (dl != destlen)) {
+		printf(__FILE__ ":Got decompress error: ret=%d, dl=%ld, destlen=%ld\n",ret,dl,(long int)destlen);
 		return -1;
+	}
 
 	return 0;
 }
@@ -92,12 +97,22 @@ int jffs2_lzo_init(void)
 {
 	int ret;
 
+	lzo_init();
+	
 	lzo_mem = malloc(LZO1X_999_MEM_COMPRESS);
 	if (!lzo_mem)
 		return -1;
 
 	/* Worse case LZO compression size from their FAQ */
-	lzo_compress_buf = malloc(page_size + (page_size / 16) + 64 + 3);
+	/* Dangerous: Seems to be wrong for 64bit intel platforms. At least it results
+                into s SEGV.
+
+	lzo_compress_buf = malloc(page_size + (page_size / 16) + 64 + 3); 
+
+	   The line below fixes the SEGV. No further work has be done to determine
+           the smallest possible size for a worstcase scenario (uncompressable data)
+	*/
+	lzo_compress_buf = malloc(2*page_size);
 	if (!lzo_compress_buf) {
 		free(lzo_mem);
 		return -1;


More information about the linux-mtd mailing list