[FFmpeg-devel,V1] lavc/mpeg4audio: add chan_config check to avoid indeterminate channels

Submitted by Jun Zhao on Sept. 21, 2019, 11:29 a.m.

Details

Message ID 1569065387-17877-1-git-send-email-mypopydev@gmail.com
State New
Headers show

Commit Message

Jun Zhao Sept. 21, 2019, 11:29 a.m.
From: Jun Zhao <barryjzhao@tencent.com>

add chan_config check to avoid indeterminate channels.

Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
---
 libavcodec/mpeg4audio.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

Comments

Moritz Barsnick Sept. 21, 2019, 1:07 p.m.
On Sat, Sep 21, 2019 at 19:29:47 +0800, Jun Zhao wrote:
> +    else {
> +        av_log(NULL, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
> +        return -1;
> +    }

I know the function definition says it returns -1 on error, but that's
already not the case: It can return AVERROR_INVALIDDATA by means of the
call to parse_config_ALS(). I believe the doc should be changed, and
this code change should also return AVERROR_INVALIDDATA.

Furthermore, can you pass and find a useful context for this av_log()
(and for the one in parse_config_ALS()? av_log() with NULL context is
very unfortunate.

Cheers,
Moritz
James Almer Sept. 21, 2019, 3:11 p.m.
On 9/21/2019 8:29 AM, Jun Zhao wrote:
> From: Jun Zhao <barryjzhao@tencent.com>
> 
> add chan_config check to avoid indeterminate channels.
> 
> Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
> ---
>  libavcodec/mpeg4audio.c |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c
> index 2197147..0ada239 100644
> --- a/libavcodec/mpeg4audio.c
> +++ b/libavcodec/mpeg4audio.c
> @@ -93,6 +93,10 @@ int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
>      c->chan_config = get_bits(gb, 4);
>      if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
>          c->channels = ff_mpeg4audio_channels[c->chan_config];
> +    else {
> +        av_log(NULL, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);

Is chan_config > 8 invalid, or currently unsupported instead?

> +        return -1;
> +    }
>      c->sbr = -1;
>      c->ps  = -1;
>      if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
>
James Almer Sept. 21, 2019, 3:16 p.m.
On 9/21/2019 10:07 AM, Moritz Barsnick wrote:
> On Sat, Sep 21, 2019 at 19:29:47 +0800, Jun Zhao wrote:
>> +    else {
>> +        av_log(NULL, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
>> +        return -1;
>> +    }
> 
> I know the function definition says it returns -1 on error, but that's
> already not the case: It can return AVERROR_INVALIDDATA by means of the
> call to parse_config_ALS(). I believe the doc should be changed, and
> this code change should also return AVERROR_INVALIDDATA.
> 
> Furthermore, can you pass and find a useful context for this av_log()
> (and for the one in parse_config_ALS()? av_log() with NULL context is
> very unfortunate.

avpriv_mpeg4audio_get_config() is tied to the ABI, so such changes can
only happen after a major bump.
It could be done to ff_mpeg4audio_get_config_gb() in the meantime, using
a new logctx paramtere, and schedule the addition to
avpriv_mpeg4audio_get_config() with a preprocessor check.

I'll look into doing that in a bit.


> 
> Cheers,
> Moritz
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
James Almer Sept. 27, 2019, 1:52 p.m.
On 9/21/2019 8:29 AM, Jun Zhao wrote:
> From: Jun Zhao <barryjzhao@tencent.com>
> 
> add chan_config check to avoid indeterminate channels.
> 
> Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
> ---
>  libavcodec/mpeg4audio.c |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c
> index 2197147..0ada239 100644
> --- a/libavcodec/mpeg4audio.c
> +++ b/libavcodec/mpeg4audio.c
> @@ -93,6 +93,10 @@ int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
>      c->chan_config = get_bits(gb, 4);
>      if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
>          c->channels = ff_mpeg4audio_channels[c->chan_config];
> +    else {
> +        av_log(NULL, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
> +        return -1;
> +    }
>      c->sbr = -1;
>      c->ps  = -1;
>      if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&

Amended with a log context and applied, thanks.

Patch hide | download patch | download mbox

diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c
index 2197147..0ada239 100644
--- a/libavcodec/mpeg4audio.c
+++ b/libavcodec/mpeg4audio.c
@@ -93,6 +93,10 @@  int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
     c->chan_config = get_bits(gb, 4);
     if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
         c->channels = ff_mpeg4audio_channels[c->chan_config];
+    else {
+        av_log(NULL, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
+        return -1;
+    }
     c->sbr = -1;
     c->ps  = -1;
     if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&