Skip to content

Commit 896113c

Browse files
committed
Fix a size limit error in decoding top-down bmps
Top-down BMPs have a negative height: http://www.fileformat.info/format/bmp/egff.htm This fixes Atronix internal bug 210
1 parent 4d7e521 commit 896113c

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

src/core/u-bmp.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ void Unmap_Bytes(void *srcp, REBYTE **dstp, char *map) {
290290
REBCNT *dp;
291291
RGBQUADPTR color;
292292
RGBQUADPTR ctab = 0;
293+
REBOOL bottom_up = 1;
293294

294295
cp = codi->data;
295296
Map_Bytes(&bmfh, &cp, mapBITMAPFILEHEADER);
@@ -346,12 +347,18 @@ void Unmap_Bytes(void *srcp, REBYTE **dstp, char *map) {
346347
if (bmfh.bfOffBits != (DWORD)(cp - codi->data))
347348
cp = codi->data + bmfh.bfOffBits;
348349

350+
if (h < 0) {
351+
bottom_up = 0;
352+
h = -h;
353+
}
354+
349355
codi->w = w;
350356
codi->h = h;
351357
codi->bits = Make_Mem(w * h * 4);
352358

353359
dp = (REBCNT *) codi->bits;
354-
dp += w * h - w;
360+
if (bottom_up)
361+
dp += w * h - w;
355362

356363
for (y = 0; y<h; y++) {
357364
switch(compression) {
@@ -497,7 +504,8 @@ void Unmap_Bytes(void *srcp, REBYTE **dstp, char *map) {
497504
codi->error = CODI_ERR_ENCODING;
498505
goto error;
499506
}
500-
dp -= 2 * w;
507+
if (bottom_up)
508+
dp -= 2 * w;
501509
}
502510
error:
503511
if (ctab) free(ctab);

0 commit comments

Comments
 (0)