Browse Source

xan: Use bytestream2 to limit reading to within the buffer

Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
tags/n2.1
Martin Storsjö 12 years ago
parent
commit
30db94dc39
1 changed files with 10 additions and 12 deletions
  1. +10
    -12
      libavcodec/xan.c

+ 10
- 12
libavcodec/xan.c View File

@@ -287,8 +287,8 @@ static int xan_wc3_decode_frame(XanContext *s, AVFrame *frame)

/* pointers to segments inside the compressed chunk */
const unsigned char *huffman_segment;
const unsigned char *size_segment;
const unsigned char *vector_segment;
GetByteContext size_segment;
GetByteContext vector_segment;
const unsigned char *imagedata_segment;
int huffman_offset, size_offset, vector_offset, imagedata_offset,
imagedata_size;
@@ -308,8 +308,8 @@ static int xan_wc3_decode_frame(XanContext *s, AVFrame *frame)
return AVERROR_INVALIDDATA;

huffman_segment = s->buf + huffman_offset;
size_segment = s->buf + size_offset;
vector_segment = s->buf + vector_offset;
bytestream2_init(&size_segment, s->buf + size_offset, s->size - size_offset);
bytestream2_init(&vector_segment, s->buf + vector_offset, s->size - vector_offset);
imagedata_segment = s->buf + imagedata_offset;

if (xan_huffman_decode(opcode_buffer, opcode_buffer_size,
@@ -361,19 +361,17 @@ static int xan_wc3_decode_frame(XanContext *s, AVFrame *frame)

case 9:
case 19:
size = *size_segment++;
size = bytestream2_get_byte(&size_segment);
break;

case 10:
case 20:
size = AV_RB16(&size_segment[0]);
size_segment += 2;
size = bytestream2_get_be16(&size_segment);
break;

case 11:
case 21:
size = AV_RB24(size_segment);
size_segment += 3;
size = bytestream2_get_be24(&size_segment);
break;
}

@@ -395,9 +393,9 @@ static int xan_wc3_decode_frame(XanContext *s, AVFrame *frame)
}
} else {
/* run-based motion compensation from last frame */
motion_x = sign_extend(*vector_segment >> 4, 4);
motion_y = sign_extend(*vector_segment & 0xF, 4);
vector_segment++;
uint8_t vector = bytestream2_get_byte(&vector_segment);
motion_x = sign_extend(vector >> 4, 4);
motion_y = sign_extend(vector & 0xF, 4);

/* copy a run of pixels from the previous frame */
xan_wc3_copy_pixel_run(s, frame, x, y, size, motion_x, motion_y);


Loading…
Cancel
Save