On 03.01.2016 02:41, Michael Niedermayer wrote:
> On Sun, Jan 03, 2016 at 01:36:13AM +0100, Andreas Cadhalpun wrote:
>> get_bits is documented to only support reading 1-25 bits.
>> get_bitsz was added for this purpose.
>>
>> Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
>> ---
>>  libavcodec/vorbisdec.c | 4 ++--
>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
>> index f773afa..9ba0bce 100644
>> --- a/libavcodec/vorbisdec.c
>> +++ b/libavcodec/vorbisdec.c
>> @@ -169,7 +169,7 @@ static const char idx_err_str[] = "Index value %d out of 
>> range (0 - %d) for %s a
>>      }
>>  #define GET_VALIDATED_INDEX(idx, bits, limit) \
>>      {\
>> -        idx = get_bits(gb, bits);\
>> +        idx = get_bitsz(gb, bits);\
>>          VALIDATE_INDEX(idx, limit)\
>>      }
> 
> this looks wrong
> bits is 8 or ilog() where ilog(0) is not allowed one way or another
> i think
> 
> for example for the audio channels
> "the numbers read in the above two steps are channel numbers representing
>  the channel to treat as magnitude and the channel to treat as angle,
>  respectively. If for any coupling step the angle channel number equals
>  the magnitude channel number " ... "the stream is undecodable."
> 
> when reading 0 bits both would be 0
> 
> 
>>  
>> @@ -585,7 +585,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context 
>> *vc)
>>  
>>              for (j = 0; j < floor_setup->data.t1.partitions; ++j) {
>>                  for (k = 0; k < 
>> floor_setup->data.t1.class_dimensions[floor_setup->data.t1.partition_class[j]];
>>  ++k, ++floor1_values) {
>> -                    floor_setup->data.t1.list[floor1_values].x = 
>> get_bits(gb, rangebits);
>> +                    floor_setup->data.t1.list[floor1_values].x = 
>> get_bitsz(gb, rangebits);
> 
> IIUC
> "Vector [floor1_x_list] is limited to a maximum length of 65 elements;
>  a setup indicating more than 65 total elements (including elements 0
>  and 1 set prior to the read loop) renders the stream undecodable. All
>  vector [floor1_x_list] element values must be unique within the vector;
>  a non-unique value renders the stream undecodable. "
> 
> suggests that values cannot be 0 as the first is hardcoded to 0

Thanks a lot for finding the relevant places in the specification.

Based on that it's probably better to just error out in these cases.
Patches for that are attached.

Best regards,
Andreas

>From d740a59b6e099c90504d55c65923def1ad6de234 Mon Sep 17 00:00:00 2001
From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
Date: Sun, 3 Jan 2016 19:11:24 +0100
Subject: [PATCH 1/2] vorbisdec: reject rangebits 0

This causes non-unique elements in floor_setup->data.t1.list, which
makes the stream undecodable according to the specification.

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libavcodec/vorbisdec.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
index f773afa..2792af1 100644
--- a/libavcodec/vorbisdec.c
+++ b/libavcodec/vorbisdec.c
@@ -573,6 +573,11 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
                 return AVERROR(ENOMEM);
 
             rangebits = get_bits(gb, 4);
+            if (!rangebits) {
+                av_log(vc->avctx, AV_LOG_ERROR,
+                       "A rangebits value of 0 is not compliant with the Vorbis I specification.\n");
+                return AVERROR_INVALIDDATA;
+            }
             rangemax = (1 << rangebits);
             if (rangemax > vc->blocksize[1] / 2) {
                 av_log(vc->avctx, AV_LOG_ERROR,
-- 
2.6.4

>From 09bf8ca4d496518b876639b793cae12066b7ba3b Mon Sep 17 00:00:00 2001
From: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
Date: Sun, 3 Jan 2016 19:20:54 +0100
Subject: [PATCH 2/2] vorbisdec: reject channel mapping with less than two
 channels

It causes the angle channel number to equal the magnitude channel
number, which makes the stream undecodable according to the
specification.

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libavcodec/vorbisdec.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
index 2792af1..313b637 100644
--- a/libavcodec/vorbisdec.c
+++ b/libavcodec/vorbisdec.c
@@ -794,6 +794,11 @@ static int vorbis_parse_setup_hdr_mappings(vorbis_context *vc)
 
         if (get_bits1(gb)) {
             mapping_setup->coupling_steps = get_bits(gb, 8) + 1;
+            if (vc->audio_channels < 2) {
+                av_log(vc->avctx, AV_LOG_ERROR,
+                       "Square polar channel mapping with less than two channels is not compliant with the Vorbis I specification.\n");
+                return AVERROR_INVALIDDATA;
+            }
             mapping_setup->magnitude      = av_mallocz(mapping_setup->coupling_steps *
                                                        sizeof(*mapping_setup->magnitude));
             mapping_setup->angle          = av_mallocz(mapping_setup->coupling_steps *
-- 
2.6.4

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to