utils: Check for extradata size overflows.
This commit is contained in:
		
							parent
							
								
									81dc6a2a3c
								
							
						
					
					
						commit
						4df30f7114
					
				@ -94,4 +94,11 @@ unsigned int avpriv_toupper4(unsigned int x);
 | 
			
		||||
int avpriv_lock_avformat(void);
 | 
			
		||||
int avpriv_unlock_avformat(void);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Maximum size in bytes of extradata.
 | 
			
		||||
 * This value was chosen such that every bit of the buffer is
 | 
			
		||||
 * addressable by a 32-bit signed integer as used by get_bits.
 | 
			
		||||
 */
 | 
			
		||||
#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE)
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_INTERNAL_H */
 | 
			
		||||
 | 
			
		||||
@ -610,6 +610,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    AVDictionary *tmp = NULL;
 | 
			
		||||
 | 
			
		||||
    if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
 | 
			
		||||
    if (options)
 | 
			
		||||
        av_dict_copy(&tmp, *options, 0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2442,9 +2442,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
 | 
			
		||||
        }
 | 
			
		||||
        if(st->parser && st->parser->parser->split && !st->codec->extradata){
 | 
			
		||||
            int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
 | 
			
		||||
            if(i){
 | 
			
		||||
            if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
 | 
			
		||||
                st->codec->extradata_size= i;
 | 
			
		||||
                st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
 | 
			
		||||
                if (!st->codec->extradata)
 | 
			
		||||
                    return AVERROR(ENOMEM);
 | 
			
		||||
                memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
 | 
			
		||||
                memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user