Skip to content

Commit 634da34

Browse files
committed
Merge pull request Konstanty#18 from sezero/szo9a
mmcmp: fix subblk processing (fixes segfaults. was broken by previous commit.)
2 parents eec2d24 + 28eb5b7 commit 634da34

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/mmcmp.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
180180
for (UINT nBlock=0; nBlock<pmmh->nblocks; nBlock++)
181181
{
182182
DWORD dwMemPos = bswapLE32(pblk_table[nBlock]);
183+
DWORD dwSubPos;
183184
LPMMCMPBLOCK pblk;
184185
LPMMCMPSUBBLOCK psubblk;
185186

@@ -191,6 +192,7 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
191192
swap_subblock(psubblk);
192193

193194
if (dwMemPos + 20 + pblk->sub_blk*8 >= dwMemLength) break;
195+
dwSubPos = dwMemPos + 20;
194196
dwMemPos += 20 + pblk->sub_blk*8;
195197
#ifdef MMCMP_LOG
196198
Log("block %d: flags=%04X sub_blocks=%d", nBlock, (UINT)pblk->flags, (UINT)pblk->sub_blk);
@@ -210,7 +212,8 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
210212
#endif
211213
memcpy(pBuffer+psubblk->unpk_pos, lpMemFile+dwMemPos, psubblk->unpk_size);
212214
dwMemPos += psubblk->unpk_size;
213-
psubblk++;
215+
memcpy(tmp1+20,lpMemFile+dwSubPos+i*8,8);
216+
swap_subblock(psubblk);
214217
}
215218
} else
216219
// Data is 16-bit packed
@@ -277,9 +280,11 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
277280
if (dwPos >= dwSize)
278281
{
279282
subblk++;
283+
memcpy(tmp1+20,lpMemFile+dwSubPos+subblk*8,8);
284+
swap_subblock(psubblk);
280285
dwPos = 0;
281-
dwSize = psubblk[subblk].unpk_size >> 1;
282-
pDest = (LPWORD)(pBuffer + psubblk[subblk].unpk_pos);
286+
dwSize = psubblk->unpk_size >> 1;
287+
pDest = (LPWORD)(pBuffer + psubblk->unpk_pos);
283288
}
284289
}
285290
} else if (pblk->num_bits < 8)
@@ -337,9 +342,11 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
337342
if (dwPos >= dwSize)
338343
{
339344
subblk++;
345+
memcpy(tmp1+20,lpMemFile+dwSubPos+subblk*8,8);
346+
swap_subblock(psubblk);
340347
dwPos = 0;
341-
dwSize = psubblk[subblk].unpk_size;
342-
pDest = pBuffer + psubblk[subblk].unpk_pos;
348+
dwSize = psubblk->unpk_size;
349+
pDest = pBuffer + psubblk->unpk_pos;
343350
}
344351
}
345352
} else

0 commit comments

Comments
 (0)