oggdec: free the ogg streams on read_header failure

Plug an annoying memory leak on broken files.
(cherry picked from commit 89b51b570daa80e6e3790fcd449fe61fc5574e07)

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
(cherry picked from commit 42bd6d9cf681306d14c92af97a40116fe4eb2522)

Conflicts:

	libavformat/oggdec.c
This commit is contained in:
Luca Barbato 2013-01-04 15:44:02 +01:00 committed by Reinhard Tartler
parent 6eebba08e1
commit 03fec31cd7

View File

@ -501,15 +501,30 @@ static int ogg_get_length(AVFormatContext *s)
return 0;
}
static int ogg_read_header(AVFormatContext *s, AVFormatParameters *ap)
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;
int ret, i;
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)
@ -594,19 +609,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)
{