From 582f3e5270b844547b27062624b19bfc1f03a027 Mon Sep 17 00:00:00 2001 From: Daniel Masato Date: Fri, 10 Apr 2020 11:43:23 +0100 Subject: [PATCH] Fix celt decoder assertion when using OPUS_CUSTOM When using OPUS_CUSTOM, `CELTDecoder->end` can be larger than 21. Assert against 25 instead in OPUS_CUSTOM builds. See https://github.com/xiph/opus/issues/172. --- libs/opus/celt/celt_decoder.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libs/opus/celt/celt_decoder.c b/libs/opus/celt/celt_decoder.c index e6efce93..74ca3b74 100644 --- a/libs/opus/celt/celt_decoder.c +++ b/libs/opus/celt/celt_decoder.c @@ -117,13 +117,19 @@ void validate_celt_decoder(CELTDecoder *st) #ifndef CUSTOM_MODES celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL)); celt_assert(st->overlap == 120); + celt_assert(st->end <= 21); +#else +/* From Section 4.3 in the spec: "The normal CELT layer uses 21 of those bands, + though Opus Custom (see Section 6.2) may use a different number of bands" + + Check if it's within the maximum number of Bark frequency bands instead */ + celt_assert(st->end <= 25); #endif celt_assert(st->channels == 1 || st->channels == 2); celt_assert(st->stream_channels == 1 || st->stream_channels == 2); celt_assert(st->downsample > 0); celt_assert(st->start == 0 || st->start == 17); celt_assert(st->start < st->end); - celt_assert(st->end <= 21); #ifdef OPUS_ARCHMASK celt_assert(st->arch >= 0); celt_assert(st->arch <= OPUS_ARCHMASK);