@@ -13,8 +13,8 @@ BOOL PP20_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength);
1313#pragma pack(1)
1414typedef 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
2020typedef 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 */
4949typedef int chk_MMCMPFILEHEADER[(sizeof (struct MMCMPFILEHEADER ) == 10 ) * 2 - 1 ];
5050typedef int chk_MMCMPHEADER[(sizeof (struct MMCMPHEADER ) == 14 ) * 2 - 1 ];
5151typedef int chk_MMCMPBLOCK[(sizeof (struct MMCMPBLOCK ) == 20 ) * 2 - 1 ];
@@ -70,7 +70,6 @@ typedef struct MMCMPBITBUFFER
7070
7171
7272DWORD 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
156155BOOL 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