Skip to content

Commit a99283f

Browse files
committed
better validation of destination buffer position and size values.
1 parent 12bdf4b commit a99283f

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/mmcmp.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)