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

Josh Boyer jwboyer at gmail.com
Wed Jan 7 08:02:55 EST 2009


On Mon, Jan 05, 2009 at 09:12:30PM +0100, Carsten Schlote wrote:
>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

>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;

What is the lzo_uint type?  If it's some odd thing that changes
size based on compile options, I'm not overly thrilled.  Anyway,
it's not immediately obvious to me why uint32_t doesn't work.

> 	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;
>-
>+	

Unneeded whitespace change.

> 	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);

Don't leave comments in the code about why things are dangerous and then
leave the code itself commented out.  A comment about why you need to
allocate a certain size is fine, but this is pretty ugly.  For a minute
I thought you were doing two mallocs and ignoring the first one because
I didn't see the multi-line /* comment.

Did you poke around with gdb at all to determine why it segfaults?

josh



More information about the linux-mtd mailing list