mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/hnm4video: check offset in decode_interframe_v4() more completely
Fixes out of array reads Fixes: signal_sigsegv_e74c1e_1092_BROCIME.HNM Fixes: signal_sigsegv_e74e85_2620_PLAQUE0.HNM Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
a7f27453f6
commit
5a08ba5381
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user