wavpack: Reset internal state on corrupted blocks
wavpack_decode_block() supposes that it is called back with the exact
same buffer unless it has returned with an error. With multi-channels
files, wavpack_decode_frame() was breaking this assumption.
Signed-off-by: Janne Grunau <janne-libav@jannau.net>
(cherry picked from commit 2c6cf13940)
Signed-off-by: Anton Khirnov <anton@khirnov.net>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Reinhard Tartler
					
				
			
			
				
	
			
			
			
						parent
						
							04b71cdedd
						
					
				
				
					commit
					d646cce15f
				
			@@ -1173,6 +1173,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
 | 
			
		||||
    return samplecount * bpp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void wavpack_decode_flush(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    WavpackContext *s = avctx->priv_data;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < s->fdec_num; i++)
 | 
			
		||||
        wv_reset_saved_context(s->fdec[i]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int wavpack_decode_frame(AVCodecContext *avctx,
 | 
			
		||||
                            void *data, int *data_size,
 | 
			
		||||
                            AVPacket *avpkt)
 | 
			
		||||
@@ -1205,11 +1214,14 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
 | 
			
		||||
        if(frame_size < 0 || frame_size > buf_size){
 | 
			
		||||
            av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n",
 | 
			
		||||
                   s->block, frame_size, buf_size);
 | 
			
		||||
            wavpack_decode_flush(avctx);
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
        if((samplecount = wavpack_decode_block(avctx, s->block, data,
 | 
			
		||||
                                               data_size, buf, frame_size)) < 0)
 | 
			
		||||
                                               data_size, buf, frame_size)) < 0) {
 | 
			
		||||
            wavpack_decode_flush(avctx);
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
        s->block++;
 | 
			
		||||
        buf += frame_size; buf_size -= frame_size;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user