Home | History | Annotate | Download | only in m_debuginfo
      1 /*--------------------------------------------------------------------*/
      2 /*--- Tiny zlib decompressor                               tinfl.c ---*/
      3 /*--------------------------------------------------------------------*/
      4 
      5 /* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32
      6    checking (inflate-only subset of miniz.c)
      7 
      8    Rich Geldreich <richgel99 (at) gmail.com>, last updated May 20, 2011
      9 
     10    Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt
     11    and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
     12 
     13    The original file has been modified in order to be a part of Valgrind
     14    project, a dynamic binary instrumentation framework.
     15    RT-RK Institute for Computer Based Systems, 2016 (mips-valgrind (at) rt-rk.com)
     16 
     17    This program is free software; you can redistribute it and/or
     18    modify it under the terms of the GNU General Public License as
     19    published by the Free Software Foundation; either version 2 of the
     20    License, or (at your option) any later version.
     21 
     22    This program is distributed in the hope that it will be useful, but
     23    WITHOUT ANY WARRANTY; without even the implied warranty of
     24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     25    General Public License for more details.
     26 
     27    You should have received a copy of the GNU General Public License
     28    along with this program; if not, write to the Free Software
     29    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     30    02111-1307, USA.
     31 
     32    The GNU General Public License is contained in the file COPYING.
     33 */
     34 
     35 #ifndef TINFL_HEADER_INCLUDED
     36 #define TINFL_HEADER_INCLUDED
     37 
     38 /* The entire decompressor coroutine is implemented in tinfl_decompress().
     39    The other functions are optional high-level helpers. */
     40 
     41 #include "pub_core_basics.h"
     42 
     43 typedef UChar  mz_uint8;
     44 typedef Short  mz_int16;
     45 typedef UShort mz_uint16;
     46 typedef UInt   mz_uint32;
     47 typedef UInt   mz_uint;
     48 typedef ULong  mz_uint64;
     49 
     50 #if defined(VGA_x86) || defined(VGA_amd64)
     51 // Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 if integer loads and stores to
     52 // unaligned addresses are acceptable on the target platform (slightly faster).
     53 #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
     54 #endif
     55 
     56 #define MINIZ_LITTLE_ENDIAN       ( defined(VG_LITTLEENDIAN) )
     57 #define MINIZ_HAS_64BIT_REGISTERS ( VG_WORDSIZE == 8 )
     58 
     59 // Works around MSVC's spammy "warning C4127: conditional expression is
     60 // constant" message.
     61 #ifdef _MSC_VER
     62   #define MZ_MACRO_END while (0, 0)
     63 #else
     64   #define MZ_MACRO_END while (0)
     65 #endif
     66 
     67 /* Decompression flags used by tinfl_decompress().
     68 
     69    TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and
     70    ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the
     71    input is a raw deflate stream.
     72 
     73    TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available
     74    beyond the end of the supplied input buffer. If clear, the input buffer
     75    contains all remaining input.
     76 
     77    TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large
     78    enough to hold the entire decompressed stream. If clear, the output buffer
     79    is at least the size of the dictionary (typically 32KB).
     80 
     81    TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the
     82    decompressed bytes.
     83 */
     84 
     85 enum
     86 {
     87   TINFL_FLAG_PARSE_ZLIB_HEADER = 1,
     88   TINFL_FLAG_HAS_MORE_INPUT = 2,
     89   TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,
     90   TINFL_FLAG_COMPUTE_ADLER32 = 8
     91 };
     92 
     93 // High level decompression functions:
     94 // tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().
     95 // On entry:
     96 //  pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.
     97 // On return:
     98 //  Function returns a pointer to the decompressed data, or NULL on failure.
     99 //  *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.
    100 //  The caller must free() the returned block when it's no longer needed.
    101 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, SizeT src_buf_len, SizeT *pOut_len, int flags);
    102 
    103 // tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.
    104 // Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.
    105 #define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((SizeT)(-1))
    106 SizeT tinfl_decompress_mem_to_mem(void *pOut_buf, SizeT out_buf_len, const void *pSrc_buf, SizeT src_buf_len, int flags);
    107 
    108 // tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.
    109 // Returns 1 on success or 0 on failure.
    110 typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);
    111 int tinfl_decompress_mem_to_callback(const void *pIn_buf, SizeT *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
    112 
    113 struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;
    114 
    115 // Max size of LZ dictionary.
    116 #define TINFL_LZ_DICT_SIZE 32768
    117 
    118 // Return status.
    119 typedef enum
    120 {
    121   TINFL_STATUS_BAD_PARAM = -3,
    122   TINFL_STATUS_ADLER32_MISMATCH = -2,
    123   TINFL_STATUS_FAILED = -1,
    124   TINFL_STATUS_DONE = 0,
    125   TINFL_STATUS_NEEDS_MORE_INPUT = 1,
    126   TINFL_STATUS_HAS_MORE_OUTPUT = 2
    127 } tinfl_status;
    128 
    129 // Initializes the decompressor to its initial state.
    130 #define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
    131 #define tinfl_get_adler32(r) (r)->m_check_adler32
    132 
    133 // Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.
    134 // This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.
    135 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, SizeT *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, SizeT *pOut_buf_size, const mz_uint32 decomp_flags);
    136 
    137 // Internal/private bits follow.
    138 enum
    139 {
    140   TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,
    141   TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
    142 };
    143 
    144 typedef struct
    145 {
    146   mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
    147   mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
    148 } tinfl_huff_table;
    149 
    150 #if MINIZ_HAS_64BIT_REGISTERS
    151   #define TINFL_USE_64BIT_BITBUF 1
    152 #endif
    153 
    154 #if TINFL_USE_64BIT_BITBUF
    155   typedef mz_uint64 tinfl_bit_buf_t;
    156   #define TINFL_BITBUF_SIZE (64)
    157 #else
    158   typedef mz_uint32 tinfl_bit_buf_t;
    159   #define TINFL_BITBUF_SIZE (32)
    160 #endif
    161 
    162 struct tinfl_decompressor_tag
    163 {
    164   mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];
    165   tinfl_bit_buf_t m_bit_buf;
    166   SizeT m_dist_from_out_buf_start;
    167   tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
    168   mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
    169 };
    170 
    171 #endif // #ifdef TINFL_HEADER_INCLUDED
    172 
    173 // ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)
    174 
    175 #ifndef TINFL_HEADER_FILE_ONLY
    176 
    177 #include "pub_core_mallocfree.h"
    178 #include "pub_core_libcbase.h"
    179 
    180 #define MZ_MAX(a,b) (((a)>(b))?(a):(b))
    181 #define MZ_MIN(a,b) (((a)<(b))?(a):(b))
    182 #define MZ_CLEAR_OBJ(obj) VG_(memset)(&(obj), 0, sizeof(obj))
    183 
    184 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
    185   #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
    186   #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
    187 #else
    188   #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
    189   #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
    190 #endif
    191 
    192 #define TINFL_MEMCPY(d, s, l) VG_(memcpy)(d, s, l)
    193 #define TINFL_MEMSET(p, c, l) VG_(memset)(p, c, l)
    194 
    195 #define TINFL_CR_BEGIN switch(r->m_state) { case 0:
    196 #define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
    197 #define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
    198 #define TINFL_CR_FINISH }
    199 
    200 // TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never
    201 // reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario.
    202 #define TINFL_GET_BYTE(state_index, c) do { \
    203   if (pIn_buf_cur >= pIn_buf_end) { \
    204     for ( ; ; ) { \
    205       if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
    206         TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
    207         if (pIn_buf_cur < pIn_buf_end) { \
    208           c = *pIn_buf_cur++; \
    209           break; \
    210         } \
    211       } else { \
    212         c = 0; \
    213         break; \
    214       } \
    215     } \
    216   } else c = *pIn_buf_cur++; } MZ_MACRO_END
    217 
    218 #define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))
    219 #define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
    220 #define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
    221 
    222 // TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.
    223 // It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a
    224 // Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the
    225 // bit buffer contains >=15 bits (deflate's max. Huffman code size).
    226 #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
    227   do { \
    228     temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
    229     if (temp >= 0) { \
    230       code_len = temp >> 9; \
    231       if ((code_len) && (num_bits >= code_len)) \
    232       break; \
    233     } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
    234        code_len = TINFL_FAST_LOOKUP_BITS; \
    235        do { \
    236           temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
    237        } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
    238     } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
    239   } while (num_bits < 15);
    240 
    241 // TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read
    242 // beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully
    243 // decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.
    244 // The slow path is only executed at the very end of the input buffer.
    245 #define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
    246   int temp; mz_uint code_len, c; \
    247   if (num_bits < 15) { \
    248     if ((pIn_buf_end - pIn_buf_cur) < 2) { \
    249        TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
    250     } else { \
    251        bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \
    252     } \
    253   } \
    254   if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
    255     code_len = temp >> 9, temp &= 511; \
    256   else { \
    257     code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
    258   } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
    259 
    260 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, SizeT *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, SizeT *pOut_buf_size, const mz_uint32 decomp_flags)
    261 {
    262   static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };
    263   static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
    264   static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
    265   static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
    266   static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
    267   static const int s_min_table_sizes[3] = { 257, 1, 4 };
    268 
    269   tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
    270   const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
    271   mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
    272   SizeT out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (SizeT)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
    273 
    274   // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).
    275   if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }
    276 
    277   num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;
    278   TINFL_CR_BEGIN
    279 
    280   bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
    281   if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
    282   {
    283     TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);
    284     counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
    285     if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (SizeT)(1U << (8U + (r->m_zhdr0 >> 4)))));
    286     if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
    287   }
    288 
    289   do
    290   {
    291     TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
    292     if (r->m_type == 0)
    293     {
    294       TINFL_SKIP_BITS(5, num_bits & 7);
    295       for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }
    296       if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }
    297       while ((counter) && (num_bits))
    298       {
    299         TINFL_GET_BITS(51, dist, 8);
    300         while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
    301         *pOut_buf_cur++ = (mz_uint8)dist;
    302         counter--;
    303       }
    304       while (counter)
    305       {
    306         SizeT n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
    307         while (pIn_buf_cur >= pIn_buf_end)
    308         {
    309           if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)
    310           {
    311             TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);
    312           }
    313           else
    314           {
    315             TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);
    316           }
    317         }
    318         n = MZ_MIN(MZ_MIN((SizeT)(pOut_buf_end - pOut_buf_cur), (SizeT)(pIn_buf_end - pIn_buf_cur)), counter);
    319         TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
    320       }
    321     }
    322     else if (r->m_type == 3)
    323     {
    324       TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
    325     }
    326     else
    327     {
    328       if (r->m_type == 1)
    329       {
    330         mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
    331         r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
    332         for ( i = 0; i <= 143; ++i) *p++ = 8;
    333         for ( ; i <= 255; ++i) *p++ = 9;
    334         for ( ; i <= 279; ++i) *p++ = 7;
    335         for ( ; i <= 287; ++i) *p++ = 8;
    336       }
    337       else
    338       {
    339         for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }
    340         MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }
    341         r->m_table_sizes[2] = 19;
    342       }
    343       for ( ; (int)r->m_type >= 0; r->m_type--)
    344       {
    345         int tree_next, tree_cur; tinfl_huff_table *pTable;
    346         mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);
    347         for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
    348         used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
    349         for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
    350         if ((65536 != total) && (used_syms > 1))
    351         {
    352           TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
    353         }
    354         for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
    355         {
    356           mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
    357           cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
    358           if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }
    359           if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
    360           rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
    361           for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
    362           {
    363             tree_cur -= ((rev_code >>= 1) & 1);
    364             if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];
    365           }
    366           tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
    367         }
    368         if (r->m_type == 2)
    369         {
    370           for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )
    371           {
    372             mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
    373             if ((dist == 16) && (!counter))
    374             {
    375               TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
    376             }
    377             num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
    378             TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
    379           }
    380           if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)
    381           {
    382             TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
    383           }
    384           TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
    385         }
    386       }
    387       for ( ; ; )
    388       {
    389         mz_uint8 *pSrc;
    390         for ( ; ; )
    391         {
    392           if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
    393           {
    394             TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
    395             if (counter >= 256)
    396               break;
    397             while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
    398             *pOut_buf_cur++ = (mz_uint8)counter;
    399           }
    400           else
    401           {
    402             int sym2; mz_uint code_len;
    403 #if TINFL_USE_64BIT_BITBUF
    404             if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }
    405 #else
    406             if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
    407 #endif
    408             if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
    409               code_len = sym2 >> 9;
    410             else
    411             {
    412               code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
    413             }
    414             counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
    415             if (counter & 256)
    416               break;
    417 
    418 #if !TINFL_USE_64BIT_BITBUF
    419             if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
    420 #endif
    421             if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
    422               code_len = sym2 >> 9;
    423             else
    424             {
    425               code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
    426             }
    427             bit_buf >>= code_len; num_bits -= code_len;
    428 
    429             pOut_buf_cur[0] = (mz_uint8)counter;
    430             if (sym2 & 256)
    431             {
    432               pOut_buf_cur++;
    433               counter = sym2;
    434               break;
    435             }
    436             pOut_buf_cur[1] = (mz_uint8)sym2;
    437             pOut_buf_cur += 2;
    438           }
    439         }
    440         if ((counter &= 511) == 256) break;
    441 
    442         num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
    443         if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
    444 
    445         TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
    446         num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
    447         if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
    448 
    449         dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
    450         if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
    451         {
    452           TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
    453         }
    454 
    455         pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
    456 
    457         if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
    458         {
    459           while (counter--)
    460           {
    461             while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
    462             *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
    463           }
    464           continue;
    465         }
    466 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
    467         else if ((counter >= 9) && (counter <= dist))
    468         {
    469           const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
    470           do
    471           {
    472             ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
    473             ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
    474             pOut_buf_cur += 8;
    475           } while ((pSrc += 8) < pSrc_end);
    476           if ((counter &= 7) < 3)
    477           {
    478             if (counter)
    479             {
    480               pOut_buf_cur[0] = pSrc[0];
    481               if (counter > 1)
    482                 pOut_buf_cur[1] = pSrc[1];
    483               pOut_buf_cur += counter;
    484             }
    485             continue;
    486           }
    487         }
    488 #endif
    489         do
    490         {
    491           pOut_buf_cur[0] = pSrc[0];
    492           pOut_buf_cur[1] = pSrc[1];
    493           pOut_buf_cur[2] = pSrc[2];
    494           pOut_buf_cur += 3; pSrc += 3;
    495         } while ((int)(counter -= 3) > 2);
    496         if ((int)counter > 0)
    497         {
    498           pOut_buf_cur[0] = pSrc[0];
    499           if ((int)counter > 1)
    500             pOut_buf_cur[1] = pSrc[1];
    501           pOut_buf_cur += counter;
    502         }
    503       }
    504     }
    505   } while (!(r->m_final & 1));
    506   if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
    507   {
    508     TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }
    509   }
    510   TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
    511   TINFL_CR_FINISH
    512 
    513 common_exit:
    514   r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;
    515   *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
    516   if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
    517   {
    518     const mz_uint8 *ptr = pOut_buf_next; SizeT buf_len = *pOut_buf_size;
    519     mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; SizeT block_len = buf_len % 5552;
    520     while (buf_len)
    521     {
    522       for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
    523       {
    524         s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
    525         s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
    526       }
    527       for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
    528       s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
    529     }
    530     r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;
    531   }
    532   return status;
    533 }
    534 
    535 // Higher level helper functions.
    536 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, SizeT src_buf_len, SizeT *pOut_len, int flags)
    537 {
    538   tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; SizeT src_buf_ofs = 0, out_buf_capacity = 0;
    539   *pOut_len = 0;
    540   tinfl_init(&decomp);
    541   for ( ; ; )
    542   {
    543     SizeT src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
    544     tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size,
    545       (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
    546     if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))
    547     {
    548       VG_(free)(pBuf); *pOut_len = 0; return NULL;
    549     }
    550     src_buf_ofs += src_buf_size;
    551     *pOut_len += dst_buf_size;
    552     if (status == TINFL_STATUS_DONE) break;
    553     new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
    554     pNew_buf = VG_(realloc)("tinfl.tinfl_decompress_mem_to_heap.1", pBuf, new_out_buf_capacity);
    555     if (!pNew_buf)
    556     {
    557       VG_(free)(pBuf); *pOut_len = 0; return NULL;
    558     }
    559     pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
    560   }
    561   return pBuf;
    562 }
    563 
    564 SizeT tinfl_decompress_mem_to_mem(void *pOut_buf, SizeT out_buf_len, const void *pSrc_buf, SizeT src_buf_len, int flags)
    565 {
    566   tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);
    567   status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
    568   return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;
    569 }
    570 
    571 int tinfl_decompress_mem_to_callback(const void *pIn_buf, SizeT *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
    572 {
    573   int result = 0;
    574   tinfl_decompressor decomp;
    575   mz_uint8 *pDict = (mz_uint8*)VG_(malloc)("tinfl.tinfl_decompress_mem_to_callback.1", TINFL_LZ_DICT_SIZE); SizeT in_buf_ofs = 0, dict_ofs = 0;
    576   if (!pDict)
    577     return TINFL_STATUS_FAILED;
    578   tinfl_init(&decomp);
    579   for ( ; ; )
    580   {
    581     SizeT in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
    582     tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
    583       (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
    584     in_buf_ofs += in_buf_size;
    585     if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
    586       break;
    587     if (status != TINFL_STATUS_HAS_MORE_OUTPUT)
    588     {
    589       result = (status == TINFL_STATUS_DONE);
    590       break;
    591     }
    592     dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
    593   }
    594   VG_(free)(pDict);
    595   *pIn_buf_size = in_buf_ofs;
    596   return result;
    597 }
    598 
    599 #endif // #ifndef TINFL_HEADER_FILE_ONLY
    600