Skip to content

Commit c7fa7b8

Browse files
committed
better sanity check for num_bits
1 parent 2016b57 commit c7fa7b8

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

src/mmcmp.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ BOOL PP20_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength);
1313
#pragma pack(1)
1414
typedef struct MMCMPFILEHEADER
1515
{
16-
char id[8]; // "ziRCONia"
17-
WORD hdrsize;
16+
char id[8]; /* string 'ziRCONia' */
17+
WORD hdrsize; /* sizeof MMCMPHEADER */
1818
} MMCMPFILEHEADER, *LPMMCMPFILEHEADER;
1919

2020
typedef struct MMCMPHEADER
@@ -45,7 +45,7 @@ typedef struct MMCMPSUBBLOCK
4545
} MMCMPSUBBLOCK, *LPMMCMPSUBBLOCK;
4646
#pragma pack()
4747

48-
// make sure of structure sizes
48+
/* make sure of structure sizes */
4949
typedef int chk_MMCMPFILEHEADER[(sizeof(struct MMCMPFILEHEADER) == 10) * 2 - 1];
5050
typedef int chk_MMCMPHEADER[(sizeof(struct MMCMPHEADER) == 14) * 2 - 1];
5151
typedef int chk_MMCMPBLOCK[(sizeof(struct MMCMPBLOCK) == 20) * 2 - 1];
@@ -70,7 +70,6 @@ typedef struct MMCMPBITBUFFER
7070

7171

7272
DWORD MMCMPBITBUFFER::GetBits(UINT nBits)
73-
//---------------------------------------
7473
{
7574
DWORD d;
7675
if (!nBits) return 0;
@@ -154,7 +153,6 @@ static BOOL MMCMP_IsDstBlockValid(const MMCMPSUBBLOCK *psub, DWORD dstlen)
154153

155154

156155
BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
157-
//---------------------------------------------------------
158156
{
159157
DWORD dwMemLength;
160158
LPCBYTE lpMemFile;
@@ -210,6 +208,16 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
210208
goto err;
211209
if (dwMemPos + 20 + pblk->sub_blk*8 >= dwMemLength)
212210
goto err;
211+
if (pblk->flags & MMCMP_COMP) {
212+
if (pblk->flags & MMCMP_16BIT) {
213+
if (pblk->num_bits >= 16)
214+
goto err;
215+
}
216+
else {
217+
if (pblk->num_bits >= 8)
218+
goto err;
219+
}
220+
}
213221

214222
dwSubPos = dwMemPos + 20;
215223
dwMemPos += 20 + pblk->sub_blk*8;
@@ -218,9 +226,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
218226
Log(" pksize=%d unpksize=%d", pblk->pk_size, pblk->unpk_size);
219227
Log(" tt_entries=%d num_bits=%d\n", pblk->tt_entries, pblk->num_bits);
220228
#endif
221-
// Data is not packed
222229
if (!(pblk->flags & MMCMP_COMP))
223-
{
230+
{ /* Data is not packed */
224231
UINT i=0;
225232
while (1) {
226233
#ifdef MMCMP_LOG
@@ -234,10 +241,9 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
234241
memcpy(tmp1+20,lpMemFile+dwSubPos+i*8,8);
235242
swap_subblock(psubblk);
236243
}
237-
} else
238-
// Data is 16-bit packed
239-
if (pblk->flags & MMCMP_16BIT && pblk->num_bits < 16)
240-
{
244+
}
245+
else if (pblk->flags & MMCMP_16BIT)
246+
{ /* Data is 16-bit packed */
241247
MMCMPBITBUFFER bb;
242248
LPBYTE pDest = pBuffer + psubblk->unpk_pos;
243249
DWORD dwSize = psubblk->unpk_size;
@@ -311,9 +317,9 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
311317
pDest = pBuffer + psubblk->unpk_pos;
312318
}
313319
}
314-
} else if (pblk->num_bits < 8)
315-
// Data is 8-bit packed
316-
{
320+
}
321+
else
322+
{ /* Data is 8-bit packed */
317323
MMCMPBITBUFFER bb;
318324
LPBYTE pDest = pBuffer + psubblk->unpk_pos;
319325
DWORD dwSize = psubblk->unpk_size;
@@ -377,25 +383,19 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
377383
pDest = pBuffer + psubblk->unpk_pos;
378384
}
379385
}
380-
} else
381-
{
382-
goto err;
383386
}
384387
}
385388
*ppMemFile = pBuffer;
386389
*pdwMemLength = dwFileSize;
387390
return TRUE;
388391

389-
err:
392+
err:
390393
free(pBuffer);
391394
return FALSE;
392395
}
393396

394397

395-
//////////////////////////////////////////////////////////////////////////////
396-
//
397-
// PowerPack PP20 Unpacker
398-
//
398+
/* PowerPack PP20 Unpacker */
399399

400400
/* Code from Heikki Orsila's amigadepack 0.02
401401
* based on code by Stuart Caie <[email protected]>

0 commit comments

Comments
 (0)