Browse Source

oggdec: free the ogg streams on read_header failure

Plug an annoying memory leak on broken files.
tags/n1.2
Luca Barbato 12 years ago
parent
commit
89b51b570d
1 changed files with 16 additions and 14 deletions
  1. +16
    -14
      libavformat/oggdec.c

+ 16
- 14
libavformat/oggdec.c View File

@@ -526,6 +526,19 @@ static int ogg_get_length(AVFormatContext *s)
return 0; 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) static int ogg_read_header(AVFormatContext *s)
{ {
struct ogg *ogg = s->priv_data; struct ogg *ogg = s->priv_data;
@@ -533,8 +546,10 @@ static int ogg_read_header(AVFormatContext *s)
ogg->curidx = -1; ogg->curidx = -1;
//linear headers seek from start //linear headers seek from start
ret = ogg_get_headers(s); ret = ogg_get_headers(s);
if (ret < 0)
if (ret < 0) {
ogg_read_close(s);
return ret; return ret;
}


for (i = 0; i < ogg->nstreams; i++) for (i = 0; i < ogg->nstreams; i++)
if (ogg->streams[i].header < 0) if (ogg->streams[i].header < 0)
@@ -619,19 +634,6 @@ retry:
return psize; 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, static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
int64_t *pos_arg, int64_t pos_limit) int64_t *pos_arg, int64_t pos_limit)
{ {


Loading…
Cancel
Save