On Fri, Nov 18, 2016 at 06:22:06PM +0100, Alexander Strasser wrote: > Hi Michael! > > On 2016-11-18 17:03 +0100, Michael Niedermayer wrote: > > This allows user apps to stop OOM due to excessive number of streams > > TODO: bump & docs > > > > Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> > > --- > > libavformat/avformat.h | 7 +++++++ > > libavformat/options_table.h | 1 + > > libavformat/utils.c | 2 +- > > 3 files changed, 9 insertions(+), 1 deletion(-) > > > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > > index f9f4d72..c81a916 100644 > > --- a/libavformat/avformat.h > > +++ b/libavformat/avformat.h > > @@ -1899,6 +1899,13 @@ typedef struct AVFormatContext { > > * - decoding: set by user through AVOptions (NO direct access) > > */ > > char *protocol_blacklist; > > + > > + /** > > + * The maximum number of streams. > > + * - encoding: unused > > + * - decoding: set by user through AVOptions (NO direct access) > > + */ > > + int max_streams; > > } AVFormatContext; > > > > int av_format_get_probe_score(const AVFormatContext *s); > > diff --git a/libavformat/options_table.h b/libavformat/options_table.h > > index 9d61d5a..d5448e5 100644 > > --- a/libavformat/options_table.h > > +++ b/libavformat/options_table.h > > @@ -105,6 +105,7 @@ static const AVOption avformat_options[] = { > > {"format_whitelist", "List of demuxers that are allowed to be used", > > OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, > > CHAR_MAX, D }, > > {"protocol_whitelist", "List of protocols that are allowed to be used", > > OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, > > CHAR_MAX, D }, > > {"protocol_blacklist", "List of protocols that are not allowed to be > > used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL }, > > CHAR_MIN, CHAR_MAX, D }, > > +{"max_streams", "maximum number of streams", OFFSET(max_streams), > > AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, D }, > > {NULL}, > > }; > > > > diff --git a/libavformat/utils.c b/libavformat/utils.c > > index 5664646..ded0b52 100644 > > --- a/libavformat/utils.c > > +++ b/libavformat/utils.c > > @@ -4210,7 +4210,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, > > const AVCodec *c) > > int i; > > AVStream **streams; > > > > - if (s->nb_streams >= INT_MAX/sizeof(*streams)) > > + if (s->nb_streams >= s->max_streams/sizeof(*streams)) > > return NULL; > > streams = av_realloc_array(s->streams, s->nb_streams + 1, > > sizeof(*streams)); > > if (!streams) > > Maybe I am completely wrong, if so just tell me and sorry for the noise... > > You name the option max_streams, but you compare it to nb_streams after > you divided it by size of a pointer. > > I guess you change it that way so the default stays the same. I hope that > can be achieved in a different way.
changed to: @@ -4210,7 +4210,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) int i; AVStream **streams; - if (s->nb_streams >= INT_MAX/sizeof(*streams)) + if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) return NULL; streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams)); if (!streams) [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB During times of universal deceit, telling the truth becomes a revolutionary act. -- George Orwell
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel