Commit 5350e0fc authored by Paul B Mahol's avatar Paul B Mahol

avcodec/iff: rewrite out of bounds checking in writer

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent fd4a52e4
...@@ -823,7 +823,7 @@ static void decode_delta_j(uint8_t *dst, ...@@ -823,7 +823,7 @@ static void decode_delta_j(uint8_t *dst,
int w, int h, int bpp, int dst_size) int w, int h, int bpp, int dst_size)
{ {
int32_t pitch; int32_t pitch;
uint8_t *end = dst + dst_size, *ptr; uint8_t *ptr;
uint32_t type, flag, cols, groups, rows, bytes; uint32_t type, flag, cols, groups, rows, bytes;
uint32_t offset; uint32_t offset;
int planepitch_byte = (w + 7) / 8; int planepitch_byte = (w + 7) / 8;
...@@ -855,22 +855,20 @@ static void decode_delta_j(uint8_t *dst, ...@@ -855,22 +855,20 @@ static void decode_delta_j(uint8_t *dst,
else else
offset = ((offset / planepitch_byte) * pitch) + (offset % planepitch_byte); offset = ((offset / planepitch_byte) * pitch) + (offset % planepitch_byte);
ptr = dst + offset;
if (ptr >= end)
return;
for (b = 0; b < cols; b++) { for (b = 0; b < cols; b++) {
for (d = 0; d < bpp; d++) { for (d = 0; d < bpp; d++) {
uint8_t value = bytestream2_get_byte(&gb); uint8_t value = bytestream2_get_byte(&gb);
if (offset >= dst_size)
return;
ptr = dst + offset;
if (flag) if (flag)
ptr[0] ^= value; ptr[0] ^= value;
else else
ptr[0] = value; ptr[0] = value;
ptr += planepitch; offset += planepitch;
if (ptr >= end)
return;
} }
} }
if ((cols * bpp) & 1) if ((cols * bpp) & 1)
...@@ -893,21 +891,21 @@ static void decode_delta_j(uint8_t *dst, ...@@ -893,21 +891,21 @@ static void decode_delta_j(uint8_t *dst,
for (r = 0; r < rows; r++) { for (r = 0; r < rows; r++) {
for (d = 0; d < bpp; d++) { for (d = 0; d < bpp; d++) {
ptr = dst + offset + (r * pitch) + d * planepitch; unsigned noffset = offset + (r * pitch) + d * planepitch;
if (ptr >= end)
return;
for (b = 0; b < bytes; b++) { for (b = 0; b < bytes; b++) {
uint8_t value = bytestream2_get_byte(&gb); uint8_t value = bytestream2_get_byte(&gb);
if (noffset >= dst_size)
return;
ptr = dst + noffset;
if (flag) if (flag)
ptr[0] ^= value; ptr[0] ^= value;
else else
ptr[0] = value; ptr[0] = value;
ptr++; noffset++;
if (ptr >= end)
return;
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment