1 #include <linux/zutil.h>
2 #include <linux/errno.h>
3 #include <linux/slab.h>
4 #include <linux/vmalloc.h>
6 /* Utility function: initialize zlib, unpack binary blob, clean up zlib,
7 * return len or negative error code.
9 int zlib_inflate_blob(void *gunzip_buf
, unsigned int sz
,
10 const void *buf
, unsigned int len
)
13 struct z_stream_s
*strm
;
17 strm
= kmalloc(sizeof(*strm
), GFP_KERNEL
);
20 strm
->workspace
= kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL
);
21 if (strm
->workspace
== NULL
)
24 /* gzip header (1f,8b,08... 10 bytes total + possible asciz filename)
25 * expected to be stripped from input
29 strm
->next_out
= gunzip_buf
;
32 rc
= zlib_inflateInit2(strm
, -MAX_WBITS
);
34 rc
= zlib_inflate(strm
, Z_FINISH
);
35 /* after Z_FINISH, only Z_STREAM_END is "we unpacked it all" */
36 if (rc
== Z_STREAM_END
)
37 rc
= sz
- strm
->avail_out
;
40 zlib_inflateEnd(strm
);
44 kfree(strm
->workspace
);
48 return rc
; /* returns Z_OK (0) if successful */