|
|
|
@@ -146,7 +146,8 @@ static void decode_interframe_v4(AVCodecContext *avctx, uint8_t *src, uint32_t s |
|
|
|
{ |
|
|
|
Hnm4VideoContext *hnm = avctx->priv_data; |
|
|
|
GetByteContext gb; |
|
|
|
uint32_t writeoffset = 0, count, left, offset; |
|
|
|
uint32_t writeoffset = 0; |
|
|
|
int count, left, offset; |
|
|
|
uint8_t tag, previous, backline, backward, swap; |
|
|
|
|
|
|
|
bytestream2_init(&gb, src, size); |
|
|
|
@@ -187,10 +188,10 @@ static void decode_interframe_v4(AVCodecContext *avctx, uint8_t *src, uint32_t s |
|
|
|
|
|
|
|
left = count; |
|
|
|
|
|
|
|
if (!backward && offset + count >= hnm->width * hnm->height) { |
|
|
|
if (!backward && offset + 2*count > hnm->width * hnm->height) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds"); |
|
|
|
break; |
|
|
|
} else if (backward && offset >= hnm->width * hnm->height) { |
|
|
|
} else if (backward && offset + 1 >= hnm->width * hnm->height) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds"); |
|
|
|
break; |
|
|
|
} else if (writeoffset + count >= hnm->width * hnm->height) { |
|
|
|
@@ -198,6 +199,17 @@ static void decode_interframe_v4(AVCodecContext *avctx, uint8_t *src, uint32_t s |
|
|
|
"Attempting to write out of bounds"); |
|
|
|
break; |
|
|
|
} |
|
|
|
if(backward) { |
|
|
|
if (offset < (!!backline)*(2 * hnm->width - 1) + 2*(left-1)) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (offset < (!!backline)*(2 * hnm->width - 1)) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (previous) { |
|
|
|
while (left > 0) { |
|
|
|
|