[FFmpeg-devel] [PATCH] sbr_qmf_analysis: sanitize input for 32-bit imdct
Andreas Cadhalpun
andreas.cadhalpun at googlemail.com
Wed Dec 2 20:58:50 CET 2015
On 19.11.2015 01:02, Andreas Cadhalpun wrote:
> If the input contains too many too large values, the imdct can overflow.
> Even if it didn't, the output would be larger than the valid range of 29
> bits.
>
> Note that this is a very delicate limit: Allowing values up to 1<<25
> does not prevent input larger than 1<<29 from arriving at
> sbr_sum_square, while limiting values to 1<<23 breaks the
> fate-aac-fixed-al_sbr_hq_cm_48_5.1 test.
>
> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> ---
>
> Nedeljko, do you have an explanation why larger input values here
> are invalid?
>
> By the way, the imdct calculations in imdct_and_windowing and
> sbr_qmf_synthesis can also overflow, so maybe need a similar check.
>
> ---
> libavcodec/aacsbr_template.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> diff --git a/libavcodec/aacsbr_template.c b/libavcodec/aacsbr_template.c
> index 66f4159..f48ddd0 100644
> --- a/libavcodec/aacsbr_template.c
> +++ b/libavcodec/aacsbr_template.c
> @@ -1153,6 +1153,9 @@ static void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct,
> INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx)
> {
> int i;
> +#if USE_FIXED
> + int j;
> +#endif
> memcpy(x , x+1024, (320-32)*sizeof(x[0]));
> memcpy(x+288, in, 1024*sizeof(x[0]));
> for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames
> @@ -1160,6 +1163,21 @@ static void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct,
> dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320);
> sbrdsp->sum64x5(z);
> sbrdsp->qmf_pre_shuffle(z);
> +#if USE_FIXED
> + for (j = 64; j < 128; j++) {
> + if (z[j] > 1<<24) {
> + av_log(NULL, AV_LOG_WARNING,
> + "sbr_qmf_analysis: value %09d too large, setting to %09d\n",
> + z[j], 1<<24);
> + z[j] = 1<<24;
> + } else if (z[j] < -(1<<24)) {
> + av_log(NULL, AV_LOG_WARNING,
> + "sbr_qmf_analysis: value %09d too small, setting to %09d\n",
> + z[j], -(1<<24));
> + z[j] = -(1<<24);
> + }
> + }
> +#endif
> mdct->imdct_half(mdct, z, z+64);
> sbrdsp->qmf_post_shuffle(W[buf_idx][i], z);
> x += 32;
>
Ping.
If nobody objects, I'll push this soon, as it fixes crashes.
Best regards,
Andreas
More information about the ffmpeg-devel
mailing list