On 01/06/2013 12:11 PM, Luca Barbato wrote:
> Plug an annoying memory leak on broken files.
> ---
>  libavformat/oggdec.c | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
> index 07af5cf..a6cd31c 100644
> --- a/libavformat/oggdec.c
> +++ b/libavformat/oggdec.c
> @@ -526,6 +526,19 @@ static int ogg_get_length(AVFormatContext *s)
>      return 0;
>  }
>  
> +static int ogg_read_close(AVFormatContext *s)
> +{
> +    struct ogg *ogg = s->priv_data;
> +    int i;
> +
> +    for (i = 0; i < ogg->nstreams; i++) {
> +        av_free(ogg->streams[i].buf);
> +        av_free(ogg->streams[i].private);
> +    }
> +    av_free(ogg->streams);
> +    return 0;
> +}
> +
>  static int ogg_read_header(AVFormatContext *s)
>  {
>      struct ogg *ogg = s->priv_data;
> @@ -533,8 +546,10 @@ static int ogg_read_header(AVFormatContext *s)
>      ogg->curidx = -1;
>      //linear headers seek from start
>      ret = ogg_get_headers(s);
> -    if (ret < 0)
> +    if (ret < 0) {
> +        ogg_read_close(s);
>          return ret;
> +    }
>  
>      for (i = 0; i < ogg->nstreams; i++)
>          if (ogg->streams[i].header < 0)
> @@ -619,19 +634,6 @@ retry:
>      return psize;
>  }
>  
> -static int ogg_read_close(AVFormatContext *s)
> -{
> -    struct ogg *ogg = s->priv_data;
> -    int i;
> -
> -    for (i = 0; i < ogg->nstreams; i++) {
> -        av_free(ogg->streams[i].buf);
> -        av_free(ogg->streams[i].private);
> -    }
> -    av_free(ogg->streams);
> -    return 0;
> -}
> -
>  static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
>                                    int64_t *pos_arg, int64_t pos_limit)
>  {

LGTM

-Justin

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to