summaryrefslogtreecommitdiff
path: root/libavformat/oggdec.c
diff options
context:
space:
mode:
authorClément Bœsch <ubitux@gmail.com>2012-09-14 23:51:30 +0200
committerClément Bœsch <ubitux@gmail.com>2012-09-16 18:27:58 +0200
commit3a8955334705fe60f3c5592ffb515ab0cacf277f (patch)
treee9484682cf5e85e1e6fb2d4e47aacd4566d6e424 /libavformat/oggdec.c
parentedca80387c70d273b2ae8e8a61a83d25378b4e16 (diff)
lavf/oggdec: rework allocations in ogg_new_streams().
Diffstat (limited to 'libavformat/oggdec.c')
-rw-r--r--libavformat/oggdec.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 05aeddd1b0..84d6d40916 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -165,28 +165,36 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial, int new_avstream)
{
struct ogg *ogg = s->priv_data;
- int idx = ogg->nstreams++;
+ int idx = ogg->nstreams;
AVStream *st;
struct ogg_stream *os;
+ size_t size;
- ogg->streams = av_realloc (ogg->streams,
- ogg->nstreams * sizeof (*ogg->streams));
+ if (av_size_mult(ogg->nstreams + 1, sizeof(*ogg->streams), &size) < 0 ||
+ !(os = av_realloc(ogg->streams, size)))
+ return AVERROR(ENOMEM);
+ ogg->streams = os;
memset (ogg->streams + idx, 0, sizeof (*ogg->streams));
os = ogg->streams + idx;
os->serial = serial;
os->bufsize = DECODER_BUFFER_SIZE;
os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
os->header = -1;
+ if (!os->buf)
+ return AVERROR(ENOMEM);
if (new_avstream) {
st = avformat_new_stream(s, NULL);
- if (!st)
+ if (!st) {
+ av_freep(&os->buf);
return AVERROR(ENOMEM);
+ }
st->id = idx;
avpriv_set_pts_info(st, 64, 1, 1000000);
}
+ ogg->nstreams++;
return idx;
}