@@ -179,11 +179,15 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
179179 swap_mfh (pmfh);
180180 swap_mmh (pmmh);
181181
182- if ((memcmp (pmfh->id ," ziRCONia" ,8 ) != 0 ) || (pmfh->hdrsize != 14 )
183- || (!pmmh->nblocks ) || (pmmh->filesize < 16 ) || (pmmh->filesize > 0x8000000 )
184- || (pmmh->blktable >= dwMemLength) || (pmmh->blktable + 4 *pmmh->nblocks > dwMemLength)) return FALSE ;
182+ if ((memcmp (pmfh->id ," ziRCONia" ,8 ) != 0 ) || (pmfh->hdrsize != 14 ))
183+ return FALSE ;
184+ if ((!pmmh->nblocks ) || (pmmh->filesize < 16 ) || (pmmh->filesize > 0x8000000 ) ||
185+ (pmmh->blktable >= dwMemLength) || (pmmh->blktable + 4 *pmmh->nblocks > dwMemLength)) {
186+ return FALSE ;
187+ }
185188 dwFileSize = pmmh->filesize ;
186- if ((pBuffer = (LPBYTE)GlobalAllocPtr (GHND, (dwFileSize + 31 ) & ~15 )) == NULL ) return FALSE ;
189+ if ((pBuffer = (LPBYTE)GlobalAllocPtr (GHND, (dwFileSize + 31 ) & ~15 )) == NULL )
190+ return FALSE ;
187191 pblk_table = (const DWORD *)(lpMemFile+pmmh->blktable );
188192 for (UINT nBlock=0 ; nBlock<pmmh->nblocks ; nBlock++)
189193 {
@@ -192,7 +196,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
192196 LPMMCMPBLOCK pblk;
193197 LPMMCMPSUBBLOCK psubblk;
194198
195- if (dwMemPos + 20 >= dwMemLength) goto err;
199+ if (dwMemPos + 20 >= dwMemLength)
200+ goto err;
196201 memcpy (tmp1,lpMemFile+dwMemPos,28 );
197202 pblk = (LPMMCMPBLOCK)(tmp1);
198203 psubblk = (LPMMCMPSUBBLOCK)(tmp1+20 );
@@ -219,7 +224,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
219224#ifdef MMCMP_LOG
220225 Log (" Unpacked sub-block %d: offset %d, size=%d\n " , i, psubblk->unpk_pos , psubblk->unpk_size );
221226#endif
222- if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize)) goto err;
227+ if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize))
228+ goto err;
223229 memcpy (pBuffer+psubblk->unpk_pos , lpMemFile+dwMemPos, psubblk->unpk_size );
224230 dwMemPos += psubblk->unpk_size ;
225231 if (++i == pblk->sub_blk ) break ;
@@ -243,14 +249,14 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
243249 if (pblk->flags & MMCMP_ABS16) Log (" ABS16 " );
244250 Log (" \n " );
245251#endif
252+ if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize))
253+ goto err;
246254 bb.bitcount = 0 ;
247255 bb.bitbuffer = 0 ;
248256 bb.pSrc = lpMemFile+dwMemPos+pblk->tt_entries ;
249257 bb.pEnd = lpMemFile+dwMemPos+pblk->pk_size ;
250258 while (1 )
251259 {
252- if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize)) goto err;
253-
254260 UINT newval = 0x10000 ;
255261 DWORD d = bb.GetBits (numbits+1 );
256262
@@ -297,6 +303,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
297303 dwPos = 0 ;
298304 memcpy (tmp1+20 ,lpMemFile+dwSubPos+subblk*8 ,8 );
299305 swap_subblock (psubblk);
306+ if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize))
307+ goto err;
300308 dwSize = psubblk->unpk_size ;
301309 pDest = pBuffer + psubblk->unpk_pos ;
302310 }
@@ -312,14 +320,14 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
312320 UINT subblk = 0 , oldval = 0 ;
313321 LPCBYTE ptable = lpMemFile+dwMemPos;
314322
323+ if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize))
324+ goto err;
315325 bb.bitcount = 0 ;
316326 bb.bitbuffer = 0 ;
317327 bb.pSrc = lpMemFile+dwMemPos+pblk->tt_entries ;
318328 bb.pEnd = lpMemFile+dwMemPos+pblk->pk_size ;
319329 while (1 )
320330 {
321- if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize)) goto err;
322-
323331 UINT newval = 0x100 ;
324332 DWORD d = bb.GetBits (numbits+1 );
325333
@@ -361,6 +369,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
361369 dwPos = 0 ;
362370 memcpy (tmp1+20 ,lpMemFile+dwSubPos+subblk*8 ,8 );
363371 swap_subblock (psubblk);
372+ if (!MMCMP_IsDstBlockValid (psubblk, dwFileSize))
373+ goto err;
364374 dwSize = psubblk->unpk_size ;
365375 pDest = pBuffer + psubblk->unpk_pos ;
366376 }
0 commit comments