diff mbox

[FFmpeg-devel,3/7] avformat/icecast: Free the right buffer on error

Message ID 20191110040733.11755-2-andreas.rheinhardt@gmail.com
State Accepted
Commit 99f505d2df521d83d53f7f9f9b359280f5af168b
Headers show

Commit Message

Andreas Rheinhardt Nov. 10, 2019, 4:07 a.m. UTC
In case an AVBPrint was not complete, icecast_open() would free some
buffers that have not been allocated yet instead of freeing the data of
the AVBPrint (if they have been allocated). Because this error does not
trigger a jump to the general cleanup section any more, one can moreover
remove a (now unnecessary) initialization of a pointer.

Furthermore, finalizing an AVBPrint can fail (namely when the string
inside the AVBPrint has not been allocated yet) and so this needs to be
checked.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavformat/icecast.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

Andreas Rheinhardt Dec. 18, 2019, 5:35 p.m. UTC | #1
Andreas Rheinhardt:
> In case an AVBPrint was not complete, icecast_open() would free some
> buffers that have not been allocated yet instead of freeing the data of
> the AVBPrint (if they have been allocated). Because this error does not
> trigger a jump to the general cleanup section any more, one can moreover
> remove a (now unnecessary) initialization of a pointer.
> 
> Furthermore, finalizing an AVBPrint can fail (namely when the string
> inside the AVBPrint has not been allocated yet) and so this needs to be
> checked.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavformat/icecast.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/libavformat/icecast.c b/libavformat/icecast.c
> index d2198b78ec..052cd37f3e 100644
> --- a/libavformat/icecast.c
> +++ b/libavformat/icecast.c
> @@ -89,7 +89,7 @@ static int icecast_open(URLContext *h, const char *uri, int flags)
>  
>      // URI part variables
>      char h_url[1024], host[1024], auth[1024], path[1024];
> -    char *headers = NULL, *user = NULL;
> +    char *headers, *user = NULL;
>      int port, ret;
>      AVBPrint bp;
>  
> @@ -105,10 +105,11 @@ static int icecast_open(URLContext *h, const char *uri, int flags)
>      cat_header(&bp, "Ice-Genre", s->genre);
>      cat_header(&bp, "Ice-Public", s->public ? "1" : "0");
>      if (!av_bprint_is_complete(&bp)) {
> -        ret = AVERROR(ENOMEM);
> -        goto cleanup;
> +        av_bprint_finalize(&bp, NULL);
> +        return AVERROR(ENOMEM);
>      }
> -    av_bprint_finalize(&bp, &headers);
> +    if ((ret = av_bprint_finalize(&bp, &headers)) < 0)
> +        return ret;
>  
>      // Set options
>      av_dict_set(&opt_dict, "method", s->legacy_icecast ? "SOURCE" : "PUT", 0);
> 
Ping.

- Andreas
Michael Niedermayer Dec. 19, 2019, 10:27 p.m. UTC | #2
On Sun, Nov 10, 2019 at 05:07:29AM +0100, Andreas Rheinhardt wrote:
> In case an AVBPrint was not complete, icecast_open() would free some
> buffers that have not been allocated yet instead of freeing the data of
> the AVBPrint (if they have been allocated). Because this error does not
> trigger a jump to the general cleanup section any more, one can moreover
> remove a (now unnecessary) initialization of a pointer.
> 
> Furthermore, finalizing an AVBPrint can fail (namely when the string
> inside the AVBPrint has not been allocated yet) and so this needs to be
> checked.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  libavformat/icecast.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)

will apply

thx

[...]
Andreas Rheinhardt Dec. 19, 2019, 10:36 p.m. UTC | #3
Michael Niedermayer:
> On Sun, Nov 10, 2019 at 05:07:29AM +0100, Andreas Rheinhardt wrote:
>> In case an AVBPrint was not complete, icecast_open() would free some
>> buffers that have not been allocated yet instead of freeing the data of
>> the AVBPrint (if they have been allocated). Because this error does not
>> trigger a jump to the general cleanup section any more, one can moreover
>> remove a (now unnecessary) initialization of a pointer.
>>
>> Furthermore, finalizing an AVBPrint can fail (namely when the string
>> inside the AVBPrint has not been allocated yet) and so this needs to be
>> checked.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>> ---
>>  libavformat/icecast.c | 9 +++++----
>>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> will apply
> 
> thx
> 
> [...]
> 
Thanks. Can you also take a look at the follow-up patch [1]?

- Andreas

[1]: https://ffmpeg.org/pipermail/ffmpeg-devel/2019-November/252778.html
Marvin Scholz Dec. 20, 2019, 8:30 a.m. UTC | #4
On 19 Dec 2019, at 23:36, Andreas Rheinhardt wrote:

> Michael Niedermayer:
>> On Sun, Nov 10, 2019 at 05:07:29AM +0100, Andreas Rheinhardt wrote:
>>> In case an AVBPrint was not complete, icecast_open() would free some
>>> buffers that have not been allocated yet instead of freeing the data of
>>> the AVBPrint (if they have been allocated). Because this error does not
>>> trigger a jump to the general cleanup section any more, one can moreover
>>> remove a (now unnecessary) initialization of a pointer.
>>>
>>> Furthermore, finalizing an AVBPrint can fail (namely when the string
>>> inside the AVBPrint has not been allocated yet) and so this needs to be
>>> checked.
>>>
>>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>>> ---
>>>  libavformat/icecast.c | 9 +++++----
>>>  1 file changed, 5 insertions(+), 4 deletions(-)
>>
>> will apply
>>
>> thx
>>
>> [...]
>>
> Thanks. Can you also take a look at the follow-up patch [1]?
>
> - Andreas

Sorry for the late reply, for some reason only saw this patch now…
LGTM

>
> [1]: https://ffmpeg.org/pipermail/ffmpeg-devel/2019-November/252778.html
>
> _______________________________________________
> 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".
diff mbox

Patch

diff --git a/libavformat/icecast.c b/libavformat/icecast.c
index d2198b78ec..052cd37f3e 100644
--- a/libavformat/icecast.c
+++ b/libavformat/icecast.c
@@ -89,7 +89,7 @@  static int icecast_open(URLContext *h, const char *uri, int flags)
 
     // URI part variables
     char h_url[1024], host[1024], auth[1024], path[1024];
-    char *headers = NULL, *user = NULL;
+    char *headers, *user = NULL;
     int port, ret;
     AVBPrint bp;
 
@@ -105,10 +105,11 @@  static int icecast_open(URLContext *h, const char *uri, int flags)
     cat_header(&bp, "Ice-Genre", s->genre);
     cat_header(&bp, "Ice-Public", s->public ? "1" : "0");
     if (!av_bprint_is_complete(&bp)) {
-        ret = AVERROR(ENOMEM);
-        goto cleanup;
+        av_bprint_finalize(&bp, NULL);
+        return AVERROR(ENOMEM);
     }
-    av_bprint_finalize(&bp, &headers);
+    if ((ret = av_bprint_finalize(&bp, &headers)) < 0)
+        return ret;
 
     // Set options
     av_dict_set(&opt_dict, "method", s->legacy_icecast ? "SOURCE" : "PUT", 0);