X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=lib_generic%2Fgunzip.c;h=d2b7ad477916b4a03fbe6b6b439cc76456d6a9cb;hb=4b99327a4121a28d2bdb2c2b841f5d97931ae905;hp=5bcf5b7b24f734ee5274156f809a8996147966db;hpb=107b801cf3fe39612d69d70581ebc3bf5e215554;p=u-boot diff --git a/lib_generic/gunzip.c b/lib_generic/gunzip.c index 5bcf5b7b24..d2b7ad4779 100644 --- a/lib_generic/gunzip.c +++ b/lib_generic/gunzip.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #define ZALLOC_ALIGNMENT 16 #define HEAD_CRC 2 @@ -36,7 +36,6 @@ #define RESERVED 0xe0 #define DEFLATED 8 -int gunzip(void *, int, unsigned char *, unsigned long *); void *zalloc(void *, unsigned, unsigned); void zfree(void *, void *, unsigned); @@ -59,8 +58,7 @@ void zfree(void *x, void *addr, unsigned nb) int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp) { - z_stream s; - int r, i, flags; + int i, flags; /* skip header */ i = 10; @@ -84,6 +82,18 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp) return (-1); } + return zunzip(dst, dstlen, src, lenp, 1, i); +} + +/* + * Uncompress blocks compressed with zlib without headers + */ +int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp, + int stoponerr, int offset) +{ + z_stream s; + int r; + s.zalloc = zalloc; s.zfree = zfree; #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) @@ -95,14 +105,14 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp) r = inflateInit2(&s, -MAX_WBITS); if (r != Z_OK) { printf ("Error: inflateInit2() returned %d\n", r); - return (-1); + return -1; } - s.next_in = src + i; - s.avail_in = *lenp - i; + s.next_in = src + offset; + s.avail_in = *lenp - offset; s.next_out = dst; s.avail_out = dstlen; r = inflate(&s, Z_FINISH); - if (r != Z_STREAM_END) { + if ((r != Z_STREAM_END) && (stoponerr==1)) { printf ("Error: inflate() returned %d\n", r); inflateEnd(&s); return (-1); @@ -110,5 +120,5 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp) *lenp = s.next_out - (unsigned char *) dst; inflateEnd(&s); - return (0); + return 0; }