diff mbox series

[FFmpeg-devel] libavfilter/af_mcompand: Check for failure to allocate memory

Message ID 20201013010701.53885-1-chris@miceli.net.au
State Superseded
Headers show
Series [FFmpeg-devel] libavfilter/af_mcompand: Check for failure to allocate memory | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make warning Make failed

Commit Message

Chris Miceli Oct. 13, 2020, 1:07 a.m. UTC
ticket 8931 mentions some missing null pointer checks and so this is one

Comments

Andreas Rheinhardt Oct. 13, 2020, 1:53 a.m. UTC | #1
Chris Miceli:
> ticket 8931 mentions some missing null pointer checks and so this is one
  ^

Nit: null pointer checks can be more than just checking allocations for
success. So how about "This commit fixes some of the unchecked
allocations mentioned in ticket #8931."

> diff of a few which are for these fixes. There are previous code pieces
> which return ENOMEM, so this should work as intended.

Better check: You can e.g. add av_max_alloc(1); before the allocations.

> ---
>  libavfilter/af_mcompand.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/libavfilter/af_mcompand.c b/libavfilter/af_mcompand.c
> index f142573bea..953f7cd407 100644
> --- a/libavfilter/af_mcompand.c
> +++ b/libavfilter/af_mcompand.c
> @@ -386,8 +386,20 @@ static int config_output(AVFilterLink *outlink)
>          }
>  
>          s->bands[i].attack_rate = av_calloc(outlink->channels, sizeof(double));
> +        if (!s->bands[i].attack_rate) {
> +            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the attack_rate\n");
> +            return AVERROR(ENOMEM);
> +        }
>          s->bands[i].decay_rate = av_calloc(outlink->channels, sizeof(double));
> +        if (!s->bands[i].decay_rate) {
> +            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the decay_rate\n");
> +            return AVERROR(ENOMEM);
> +        }
>          s->bands[i].volume = av_calloc(outlink->channels, sizeof(double));
> +        if (!s->bands[i].volume) {
> +            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the volume\n");
> +            return AVERROR(ENOMEM);
> +        }
>          for (k = 0; k < FFMIN(nb_attacks / 2, outlink->channels); k++) {
>              char *tstr3 = av_strtok(p3, ",", &saveptr3);
>  
> 
I don't think it is necessary to add a log message for any of these: It
is very unlikely that these errors will be triggered at all and if so,
these messages won't help the user at all (well, they could look up in
the source code what the array that couldn't be allocated is exactly,
but why would they do this?). They just take up space in the binary and
make the code less readable.

- Andreas
diff mbox series

Patch

diff of a few which are for these fixes. There are previous code pieces
which return ENOMEM, so this should work as intended.
---
 libavfilter/af_mcompand.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/libavfilter/af_mcompand.c b/libavfilter/af_mcompand.c
index f142573bea..953f7cd407 100644
--- a/libavfilter/af_mcompand.c
+++ b/libavfilter/af_mcompand.c
@@ -386,8 +386,20 @@  static int config_output(AVFilterLink *outlink)
         }
 
         s->bands[i].attack_rate = av_calloc(outlink->channels, sizeof(double));
+        if (!s->bands[i].attack_rate) {
+            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the attack_rate\n");
+            return AVERROR(ENOMEM);
+        }
         s->bands[i].decay_rate = av_calloc(outlink->channels, sizeof(double));
+        if (!s->bands[i].decay_rate) {
+            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the decay_rate\n");
+            return AVERROR(ENOMEM);
+        }
         s->bands[i].volume = av_calloc(outlink->channels, sizeof(double));
+        if (!s->bands[i].volume) {
+            av_log(ctx, AV_LOG_ERROR, "Could not allocate memory for the volume\n");
+            return AVERROR(ENOMEM);
+        }
         for (k = 0; k < FFMIN(nb_attacks / 2, outlink->channels); k++) {
             char *tstr3 = av_strtok(p3, ",", &saveptr3);