inflate.c (5c34202b8bf942da411b6599668a76b07449bbfd) | inflate.c (8336793baf962163c9fab5a3f39614295fdbab27) |
---|---|
1/* inflate.c -- zlib decompression 2 * Copyright (C) 1995-2005 Mark Adler 3 * For conditions of distribution and use, see copyright notice in zlib.h 4 * 5 * Based on zlib 1.2.3 but modified for the Linux Kernel by 6 * Richard Purdie <richard@openedhand.com> 7 * 8 * Changes mainly for static instead of dynamic memory allocation --- 318 unchanged lines hidden (view full) --- 327 stream available. So the only thing the flush parameter actually does is: 328 when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it 329 will return Z_BUF_ERROR if it has not reached the end of the stream. 330 */ 331 332int zlib_inflate(z_streamp strm, int flush) 333{ 334 struct inflate_state *state; | 1/* inflate.c -- zlib decompression 2 * Copyright (C) 1995-2005 Mark Adler 3 * For conditions of distribution and use, see copyright notice in zlib.h 4 * 5 * Based on zlib 1.2.3 but modified for the Linux Kernel by 6 * Richard Purdie <richard@openedhand.com> 7 * 8 * Changes mainly for static instead of dynamic memory allocation --- 318 unchanged lines hidden (view full) --- 327 stream available. So the only thing the flush parameter actually does is: 328 when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it 329 will return Z_BUF_ERROR if it has not reached the end of the stream. 330 */ 331 332int zlib_inflate(z_streamp strm, int flush) 333{ 334 struct inflate_state *state; |
335 unsigned char *next; /* next input */ 336 unsigned char *put; /* next output */ | 335 const unsigned char *next; /* next input */ 336 unsigned char *put; /* next output */ |
337 unsigned have, left; /* available input and output */ 338 unsigned long hold; /* bit buffer */ 339 unsigned bits; /* bits in bit buffer */ 340 unsigned in, out; /* save starting available input and output */ 341 unsigned copy; /* number of stored or match bytes to copy */ | 337 unsigned have, left; /* available input and output */ 338 unsigned long hold; /* bit buffer */ 339 unsigned bits; /* bits in bit buffer */ 340 unsigned in, out; /* save starting available input and output */ 341 unsigned copy; /* number of stored or match bytes to copy */ |
342 unsigned char *from; /* where to copy match bytes from */ | 342 unsigned char *from; /* where to copy match bytes from */ |
343 code this; /* current decoding table entry */ 344 code last; /* parent table entry */ 345 unsigned len; /* length to copy for repeats, bits to drop */ 346 int ret; /* return code */ 347 static const unsigned short order[19] = /* permutation of code lengths */ 348 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 349 350 /* Do not check for strm->next_out == NULL here as ppc zImage --- 541 unchanged lines hidden (view full) --- 892 Byte *saved_no = z->next_out; 893 uInt saved_ao = z->avail_out; 894 895 if (state->mode != TYPE && state->mode != HEAD) 896 return Z_DATA_ERROR; 897 898 /* Setup some variables to allow misuse of updateWindow */ 899 z->avail_out = 0; | 343 code this; /* current decoding table entry */ 344 code last; /* parent table entry */ 345 unsigned len; /* length to copy for repeats, bits to drop */ 346 int ret; /* return code */ 347 static const unsigned short order[19] = /* permutation of code lengths */ 348 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 349 350 /* Do not check for strm->next_out == NULL here as ppc zImage --- 541 unchanged lines hidden (view full) --- 892 Byte *saved_no = z->next_out; 893 uInt saved_ao = z->avail_out; 894 895 if (state->mode != TYPE && state->mode != HEAD) 896 return Z_DATA_ERROR; 897 898 /* Setup some variables to allow misuse of updateWindow */ 899 z->avail_out = 0; |
900 z->next_out = z->next_in + z->avail_in; | 900 z->next_out = (unsigned char*)z->next_in + z->avail_in; |
901 902 zlib_updatewindow(z, z->avail_in); 903 904 /* Restore saved variables */ 905 z->avail_out = saved_ao; 906 z->next_out = saved_no; 907 908 z->adler = state->check = 909 UPDATE(state->check, z->next_in, z->avail_in); 910 911 z->total_out += z->avail_in; 912 z->total_in += z->avail_in; 913 z->next_in += z->avail_in; 914 state->total += z->avail_in; 915 z->avail_in = 0; 916 917 return Z_OK; 918} | 901 902 zlib_updatewindow(z, z->avail_in); 903 904 /* Restore saved variables */ 905 z->avail_out = saved_ao; 906 z->next_out = saved_no; 907 908 z->adler = state->check = 909 UPDATE(state->check, z->next_in, z->avail_in); 910 911 z->total_out += z->avail_in; 912 z->total_in += z->avail_in; 913 z->next_in += z->avail_in; 914 state->total += z->avail_in; 915 z->avail_in = 0; 916 917 return Z_OK; 918} |
919 920#include <linux/errno.h> 921#include <linux/slab.h> 922#include <linux/vmalloc.h> 923 924/* Utility function: initialize zlib, unpack binary blob, clean up zlib, 925 * return len or negative error code. */ 926int zlib_inflate_blob(void *gunzip_buf, unsigned sz, const void *buf, unsigned len) 927{ 928 const u8 *zbuf = buf; 929 struct z_stream_s *strm; 930 int rc; 931 932 rc = -ENOMEM; 933 strm = kmalloc(sizeof(*strm), GFP_KERNEL); 934 if (strm == NULL) 935 goto gunzip_nomem1; 936 strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); 937 if (strm->workspace == NULL) 938 goto gunzip_nomem2; 939 940 /* gzip header (1f,8b,08... 10 bytes total + possible asciz filename) 941 * expected to be stripped from input */ 942 943 strm->next_in = zbuf; 944 strm->avail_in = len; 945 strm->next_out = gunzip_buf; 946 strm->avail_out = sz; 947 948 rc = zlib_inflateInit2(strm, -MAX_WBITS); 949 if (rc == Z_OK) { 950 rc = zlib_inflate(strm, Z_FINISH); 951 /* after Z_FINISH, only Z_STREAM_END is "we unpacked it all" */ 952 if (rc == Z_STREAM_END) 953 rc = sz - strm->avail_out; 954 else 955 rc = -EINVAL; 956 zlib_inflateEnd(strm); 957 } else 958 rc = -EINVAL; 959 960 kfree(strm->workspace); 961gunzip_nomem2: 962 kfree(strm); 963gunzip_nomem1: 964 return rc; /* returns Z_OK (0) if successful */ 965} |
|