You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/dxa: check for overread in decode_13()
Fixes use of uninitialized memory Fixes part of msan_uninit-mem_7f5ea8284fb7_8317_scummvm.dxa Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		| @@ -51,13 +51,17 @@ static const int shift1[6] = { 0, 8, 8, 8, 4, 4 }; | ||||
| static const int shift2[6] = { 0, 0, 8, 4, 0, 4 }; | ||||
|  | ||||
| static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, | ||||
|                      int stride, uint8_t *src, uint8_t *ref) | ||||
|                      int stride, uint8_t *src, int srcsize, uint8_t *ref) | ||||
| { | ||||
|     uint8_t *code, *data, *mv, *msk, *tmp, *tmp2; | ||||
|     uint8_t *src_end = src + srcsize; | ||||
|     int i, j, k; | ||||
|     int type, x, y, d, d2; | ||||
|     uint32_t mask; | ||||
|  | ||||
|     if (12ULL  + ((avctx->width * avctx->height) >> 4) + AV_RB32(src + 0) + AV_RB32(src + 4) > srcsize) | ||||
|         return AVERROR_INVALIDDATA; | ||||
|  | ||||
|     code = src  + 12; | ||||
|     data = code + ((avctx->width * avctx->height) >> 4); | ||||
|     mv   = data + AV_RB32(src + 0); | ||||
| @@ -65,6 +69,8 @@ static int decode_13(AVCodecContext *avctx, DxaDecContext *c, uint8_t* dst, | ||||
|  | ||||
|     for(j = 0; j < avctx->height; j += 4){ | ||||
|         for(i = 0; i < avctx->width; i += 4){ | ||||
|             if (data > src_end || mv > src_end || msk > src_end) | ||||
|                 return AVERROR_INVALIDDATA; | ||||
|             tmp  = dst + i; | ||||
|             tmp2 = ref + i; | ||||
|             type = *code++; | ||||
| @@ -302,7 +308,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac | ||||
|             av_log(avctx, AV_LOG_ERROR, "Missing reference frame\n"); | ||||
|             return AVERROR_INVALIDDATA; | ||||
|         } | ||||
|         decode_13(avctx, c, frame->data[0], frame->linesize[0], srcptr, c->prev->data[0]); | ||||
|         decode_13(avctx, c, frame->data[0], frame->linesize[0], srcptr, dsize, c->prev->data[0]); | ||||
|         break; | ||||
|     default: | ||||
|         av_log(avctx, AV_LOG_ERROR, "Unknown/unsupported compression type %d\n", compr); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user