1
0
mirror of https://github.com/hashcat/hashcat.git synced 2024-11-22 16:18:09 +00:00

Fix a bug causing -m172xx (pkzip) to fail on data sizes > 32 KB

We need a correct total_out size so a separate variable is introduced
to maintain the window buffer.

Closes #3434 (see #3546).
This commit is contained in:
magnum 2022-12-21 18:31:53 +01:00
parent 6bd5e6f03f
commit 2e10d591b9

View File

@ -434,6 +434,7 @@ typedef struct mz_stream_s
PRIVATE_AS unsigned char *next_out; /* pointer to next byte to write */ PRIVATE_AS unsigned char *next_out; /* pointer to next byte to write */
unsigned int avail_out; /* number of bytes that can be written to next_out */ unsigned int avail_out; /* number of bytes that can be written to next_out */
mz_ulong total_out; /* total number of bytes produced so far */ mz_ulong total_out; /* total number of bytes produced so far */
mz_ulong window_out; /* total number of bytes produced in window so far */
PRIVATE_AS char *msg; /* error msg (unused) */ PRIVATE_AS char *msg; /* error msg (unused) */
PRIVATE_AS inflate_state *state; /* internal state, allocated by zalloc/zfree */ PRIVATE_AS inflate_state *state; /* internal state, allocated by zalloc/zfree */
@ -980,6 +981,7 @@ DECLSPEC int mz_inflateInit2 (mz_streamp pStream, int window_bits, PRIVATE_AS in
pStream->msg = Z_NULL; pStream->msg = Z_NULL;
pStream->total_in = 0; pStream->total_in = 0;
pStream->total_out = 0; pStream->total_out = 0;
pStream->window_out = 0;
pStream->reserved = 0; pStream->reserved = 0;
//pStream->state = (struct mz_internal_state *)pDecomp; //pStream->state = (struct mz_internal_state *)pDecomp;
@ -1047,6 +1049,7 @@ DECLSPEC int mz_inflate(mz_streamp pStream, int flush)
//pStream->next_out += (mz_uint)out_bytes; //pStream->next_out += (mz_uint)out_bytes;
//pStream->avail_out -= (mz_uint)out_bytes; //pStream->avail_out -= (mz_uint)out_bytes;
pStream->total_out += (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;
pStream->window_out += (mz_uint)out_bytes;
if (status < 0) if (status < 0)
return MZ_DATA_ERROR; return MZ_DATA_ERROR;
@ -1076,6 +1079,7 @@ DECLSPEC int mz_inflate(mz_streamp pStream, int flush)
//pStream->next_out += n; //pStream->next_out += n;
//pStream->avail_out -= n; //pStream->avail_out -= n;
pStream->total_out += n; pStream->total_out += n;
pStream->window_out += n;
pState->m_dict_avail -= n; pState->m_dict_avail -= n;
pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
@ -1110,6 +1114,7 @@ DECLSPEC int mz_inflate(mz_streamp pStream, int flush)
//pStream->next_out += n; //pStream->next_out += n;
//pStream->avail_out -= n; //pStream->avail_out -= n;
pStream->total_out += n; pStream->total_out += n;
pStream->window_out += n;
pState->m_dict_avail -= n; pState->m_dict_avail -= n;
pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
@ -1186,12 +1191,12 @@ DECLSPEC int hc_inflate (mz_streamp pStream)
size_t out_bytes = pStream->avail_out; size_t out_bytes = pStream->avail_out;
tinfl_status status = tinfl_decompress (&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out + pStream->total_out, &out_bytes, decomp_flags, pStream); tinfl_status status = tinfl_decompress (&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out + pStream->window_out, &out_bytes, decomp_flags, pStream);
#ifdef CRC32_IN_INFLATE #ifdef CRC32_IN_INFLATE
for (int i = 0; i < out_bytes; i++) for (int i = 0; i < out_bytes; i++)
{ {
pStream->crc32 = CRC32 (pStream->crc32, pStream->next_out[pStream->total_out + i], pStream->crc32tab); pStream->crc32 = CRC32 (pStream->crc32, pStream->next_out[pStream->window_out + i], pStream->crc32tab);
} }
#endif #endif
@ -1201,6 +1206,7 @@ DECLSPEC int hc_inflate (mz_streamp pStream)
pStream->avail_out -= out_bytes; pStream->avail_out -= out_bytes;
pStream->total_out += out_bytes; pStream->total_out += out_bytes;
pStream->window_out += out_bytes;
if (pStream->avail_out < TINFL_LZ_DICT_SIZE) if (pStream->avail_out < TINFL_LZ_DICT_SIZE)
{ {
@ -1209,10 +1215,10 @@ DECLSPEC int hc_inflate (mz_streamp pStream)
// move the last TINFL_LZ_DICT_SIZE bytes to the start of the output buffer // move the last TINFL_LZ_DICT_SIZE bytes to the start of the output buffer
// zlib_memcpy (pStream->next_out, pStream->next_out + pStream->total_out - TINFL_LZ_DICT_SIZE, TINFL_LZ_DICT_SIZE); // zlib_memcpy (pStream->next_out, pStream->next_out + pStream->total_out - TINFL_LZ_DICT_SIZE, TINFL_LZ_DICT_SIZE);
hc_shift_inflate_dict (pStream->next_out, pStream->total_out - TINFL_LZ_DICT_SIZE, TINFL_LZ_DICT_SIZE); hc_shift_inflate_dict (pStream->next_out, pStream->window_out - TINFL_LZ_DICT_SIZE, TINFL_LZ_DICT_SIZE);
pStream->avail_out = TINFL_LZ_DICT_SIZE; pStream->avail_out = TINFL_LZ_DICT_SIZE;
pStream->total_out = TINFL_LZ_DICT_SIZE; pStream->window_out = TINFL_LZ_DICT_SIZE;
} }
if (status < 0) if (status < 0)