public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/9] ubifs: BUG: Blocks commpressed with zlib
@ 2009-04-24 11:50 Ricardo Ribalda Delgado
  2009-04-24 11:50 ` [U-Boot] [PATCH 9/9] ubifs: Add '\0' to the end of the realpath Ricardo Ribalda Delgado
  2009-04-24 14:17 ` [U-Boot] [PATCH 1/9] ubifs: BUG: Blocks commpressed with zlib Stefan Roese
  0 siblings, 2 replies; 4+ messages in thread
From: Ricardo Ribalda Delgado @ 2009-04-24 11:50 UTC (permalink / raw)
  To: u-boot

Blocks compressed with zlib are not handled correctly.
gunzip decompress blocks with the gzip header, but ubi blocks
dont have header.
---
 fs/ubifs/ubifs.c |   43 ++++++++++++++++++++++++++++++++++++++++++-
 fs/ubifs/ubifs.h |    2 --
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c
index 32f9ff8..0708d90 100644
--- a/fs/ubifs/ubifs.c
+++ b/fs/ubifs/ubifs.c
@@ -24,6 +24,7 @@
  */
 
 #include "ubifs.h"
+#include <u-boot/zlib.h>
 
 #if !defined(CONFIG_SYS_64BIT_VSPRINTF)
 #warning Please define CONFIG_SYS_64BIT_VSPRINTF for correct output!
@@ -33,6 +34,10 @@ DECLARE_GLOBAL_DATA_PTR;
 
 /* compress.c */
 
+int ubi_gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp);
+void *zalloc(void *, unsigned, unsigned);
+void zfree(void *, void *, unsigned);
+
 /*
  * We need a wrapper for gunzip() because the parameters are
  * incompatible with the lzo decompressor.
@@ -41,7 +46,7 @@ static int gzip_decompress(const unsigned char *in, size_t in_len,
 			   unsigned char *out, size_t *out_len)
 {
 	unsigned long len = in_len;
-	return gunzip(out, *out_len, (unsigned char *)in, &len);
+	return ubi_gunzip(out, *out_len, (unsigned char *)in, &len);
 }
 
 /* Fake description object for the "none" compressor */
@@ -685,3 +690,39 @@ out:
 	ubi_close_volume(c->ubi);
 	return err;
 }
+
+int ubi_gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
+{
+	z_stream s;
+	int r, i, flags;
+	i=0;
+
+	s.zalloc = zalloc;
+	s.zfree = zfree;
+#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
+	s.outcb = (cb_func)WATCHDOG_RESET;
+#else
+	s.outcb = Z_NULL;
+#endif	/* CONFIG_HW_WATCHDOG */
+
+	r = inflateInit2(&s, -MAX_WBITS);
+	if (r != Z_OK) {
+		printf ("Error: inflateInit2() returned %d\n", r);
+		return (-1);
+	}
+	s.next_in = src + i;
+	s.avail_in = *lenp - i;
+	s.next_out = dst;
+	s.avail_out = dstlen;
+	r = inflate(&s, Z_FINISH);
+	if (r != Z_STREAM_END) {
+		//printf ("Error: inflate() returned %d\n", r);
+		//inflateEnd(&s);
+		//return (-1);
+	}
+	*lenp = s.next_out - (unsigned char *) dst;
+	inflateEnd(&s);
+
+	return (0);
+
+}
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index 91351de..a68e4c1 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -2172,6 +2172,4 @@ int ubifs_decompress(const void *buf, int len, void *out, int *out_len,
 /* todo: Move these to a common U-Boot header */
 int lzo1x_decompress_safe(const unsigned char *in, size_t in_len,
 			  unsigned char *out, size_t *out_len);
-int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp);
-
 #endif /* !__UBIFS_H__ */
-- 
1.6.2.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-04-24 14:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-24 11:50 [U-Boot] [PATCH 1/9] ubifs: BUG: Blocks commpressed with zlib Ricardo Ribalda Delgado
2009-04-24 11:50 ` [U-Boot] [PATCH 9/9] ubifs: Add '\0' to the end of the realpath Ricardo Ribalda Delgado
2009-04-24 14:13   ` Stefan Roese
2009-04-24 14:17 ` [U-Boot] [PATCH 1/9] ubifs: BUG: Blocks commpressed with zlib Stefan Roese

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox