On Fri, Nov 18, 2016 at 06:35:01PM +0100, Michael Niedermayer wrote: > 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;
and applied [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel