mirror of
				https://github.com/eledio-devices/thirdparty-miniz.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	Add v1.16 beta r1 changes.
This commit is contained in:
		| @@ -10,23 +10,10 @@ | ||||
| #define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END | ||||
| #define TINFL_CR_FINISH } | ||||
|  | ||||
| // 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 | ||||
| // reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. | ||||
| #define TINFL_GET_BYTE(state_index, c) do { \ | ||||
|   if (pIn_buf_cur >= pIn_buf_end) { \ | ||||
|     for ( ; ; ) { \ | ||||
|       if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ | ||||
|         TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ | ||||
|         if (pIn_buf_cur < pIn_buf_end) { \ | ||||
|           c = *pIn_buf_cur++; \ | ||||
|           break; \ | ||||
|         } \ | ||||
|       } else { \ | ||||
|         c = 0; \ | ||||
|         break; \ | ||||
|       } \ | ||||
|     } \ | ||||
|   } else c = *pIn_buf_cur++; } MZ_MACRO_END | ||||
|   while (pIn_buf_cur >= pIn_buf_end) { \ | ||||
|     TINFL_CR_RETURN(state_index, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); \ | ||||
|   } c = *pIn_buf_cur++; } MZ_MACRO_END | ||||
|  | ||||
| #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)) | ||||
| #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 | ||||
| @@ -55,6 +42,8 @@ | ||||
| // 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 | ||||
| // 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. | ||||
| // The slow path is only executed at the very end of the input buffer. | ||||
| // v1.16: The original macro handled the case at the very end of the passed-in input buffer, but we also need to handle the case where the user passes in 1+zillion bytes | ||||
| // following the deflate data and our non-conservative read-ahead path won't kick in here on this code. This is much trickier. | ||||
| #define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ | ||||
|   int temp; mz_uint code_len, c; \ | ||||
|   if (num_bits < 15) { \ | ||||
| @@ -119,14 +108,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex | ||||
|         size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } | ||||
|         while (pIn_buf_cur >= pIn_buf_end) | ||||
|         { | ||||
|           if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) | ||||
|           { | ||||
|             TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); | ||||
|           } | ||||
|           else | ||||
|           { | ||||
|             TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); | ||||
|           } | ||||
|           TINFL_CR_RETURN(38, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); | ||||
|         } | ||||
|         n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); | ||||
|         TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; | ||||
| @@ -313,15 +295,27 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex | ||||
|       } | ||||
|     } | ||||
|   } while (!(r->m_final & 1)); | ||||
|  | ||||
|   // Ensure byte alignment and put back any bytes from the bitbuf if we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data. | ||||
|   // I'm being super conservative here. A number of simplifications can be made to the byte alignment part, and the Adler32 check shouldn't ever need to worry about reading from the bitbuf now. | ||||
|   TINFL_SKIP_BITS(32, num_bits & 7); | ||||
|   while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } bit_buf &= (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL); | ||||
|   MZ_ASSERT(!num_bits); // if this assert fires then we've read beyond the end of non-deflate/zlib streams with following data (such as gzip streams). | ||||
|  | ||||
|   if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) | ||||
|   { | ||||
|     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; } | ||||
|     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; } | ||||
|   } | ||||
|   TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); | ||||
|  | ||||
|   TINFL_CR_FINISH | ||||
|  | ||||
| common_exit: | ||||
|   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; | ||||
|   // As long as we aren't telling the caller that we NEED more input to make forward progress: | ||||
|   // Put back any bytes from the bitbuf in case we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data. | ||||
|   // We need to be very careful here to NOT push back any bytes we definitely know we need to make forward progress, though, or we'll lock the caller up into an inf loop. | ||||
|   if ((status != TINFL_STATUS_NEEDS_MORE_INPUT) && (status != TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS)) { while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } } | ||||
|   r->m_num_bits = num_bits; r->m_bit_buf = bit_buf & (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL); 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; | ||||
|   *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; | ||||
|   if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) | ||||
|   { | ||||
| @@ -405,3 +399,17 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, | ||||
|   *pIn_buf_size = in_buf_ofs; | ||||
|   return result; | ||||
| } | ||||
|  | ||||
|  | ||||
| tinfl_decompressor *tinfl_decompressor_alloc() | ||||
| { | ||||
|   tinfl_decompressor *pDecomp = (tinfl_decompressor *)MZ_MALLOC(sizeof(tinfl_decompressor)); | ||||
|   if (pDecomp) | ||||
|     tinfl_init(pDecomp); | ||||
|   return pDecomp; | ||||
| } | ||||
|  | ||||
| void tinfl_decompressor_free(tinfl_decompressor *pDecomp) | ||||
| { | ||||
|   MZ_FREE(pDecomp); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user