int bmhd, body;
RGBQUAD rgbx[256];
+ if (len < 12)
+ return;
bmih = NULL;
bmhd = 0, body = 0;
bmsize = 0;
addr = saddr;
eaddr = addr + len;
size = (addr[4] << 24) | (addr[5] << 16) | (addr[6] << 8) | (addr[7] << 0);
+ if (size > 0xffffff)
+ return;
if (memcmp ("ILBM", addr + 8, 4))
return;
camg = 0;
uae_u8 *paddr, *ceaddr;
paddr = addr;
+ if (paddr + 8 > eaddr)
+ return;
memcpy (chunk, addr, 4);
csize = (addr[4] << 24) | (addr[5] << 16) | (addr[6] << 8) | (addr[7] << 0);
addr += 8;
ceaddr = addr + csize;
+ // chunk end larger than end of data?
+ if (ceaddr > eaddr)
+ return;
if (!memcmp (chunk, "BMHD" ,4)) {
bmhd = 1;
w = (addr[0] << 8) | addr[1];