From b1306823d0b3ae998c8e10ad832004eb13bdd93e Mon Sep 17 00:00:00 2001 From: Vittorio Giovara Date: Wed, 17 Dec 2014 14:53:45 +0100 Subject: check memory errors from av_strdup() --- avconv_opt.c | 2 ++ avprobe.c | 4 ++++ cmdutils.c | 10 +++++++++- libavformat/matroskaenc.c | 16 ++++++++++++---- libavutil/opt.c | 8 +++++--- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/avconv_opt.c b/avconv_opt.c index 6d43bc1609..74e235b6d5 100644 --- a/avconv_opt.c +++ b/avconv_opt.c @@ -213,6 +213,8 @@ static int opt_map(void *optctx, const char *opt, const char *arg) arg++; } map = av_strdup(arg); + if (!map) + return AVERROR(ENOMEM); /* parse sync stream first, just pick first matching stream */ if (sync = strchr(map, ',')) { diff --git a/avprobe.c b/avprobe.c index 5fc9ad5694..6198c05c56 100644 --- a/avprobe.c +++ b/avprobe.c @@ -302,6 +302,8 @@ static void old_print_object_header(const char *name) return; str = p = av_strdup(name); + if (!str) + return; while (*p) { *p = av_toupper(*p); p++; @@ -319,6 +321,8 @@ static void old_print_object_footer(const char *name) return; str = p = av_strdup(name); + if (!str) + return; while (*p) { *p = av_toupper(*p); p++; diff --git a/cmdutils.c b/cmdutils.c index 19589cea5b..f074dd0861 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -261,10 +261,14 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt, if (po->flags & OPT_SPEC) { SpecifierOpt **so = dst; char *p = strchr(opt, ':'); + char *str; dstcount = (int *)(so + 1); *so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1); - (*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : ""); + str = av_strdup(p ? p + 1 : ""); + if (!str) + return AVERROR(ENOMEM); + (*so)[*dstcount - 1].specifier = str; dst = &(*so)[*dstcount - 1].u; } @@ -272,6 +276,8 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt, char *str; str = av_strdup(arg); av_freep(dst); + if (!str) + return AVERROR(ENOMEM); *(char **)dst = str; } else if (po->flags & OPT_BOOL || po->flags & OPT_INT) { *(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); @@ -1350,6 +1356,8 @@ int show_help(void *optctx, const char *opt, const char *arg) av_log_set_callback(log_callback_help); topic = av_strdup(arg ? arg : ""); + if (!topic) + return AVERROR(ENOMEM); par = strchr(topic, '='); if (par) *par++ = 0; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 8a7cfa128f..1d55b6629a 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -936,13 +936,16 @@ static int mkv_write_chapters(AVFormatContext *s) return 0; } -static void mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t) +static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t) { uint8_t *key = av_strdup(t->key); uint8_t *p = key; const uint8_t *lang = NULL; ebml_master tag; + if (!key) + return AVERROR(ENOMEM); + if ((p = strrchr(p, '-')) && (lang = av_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL))) *p = 0; @@ -964,6 +967,7 @@ static void mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t) end_ebml_master(pb, tag); av_freep(&key); + return 0; } static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid, @@ -987,10 +991,14 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int eleme put_ebml_uint(s->pb, elementid, uid); end_ebml_master(s->pb, targets); - while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) + while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) { if (av_strcasecmp(t->key, "title") && - av_strcasecmp(t->key, "encoding_tool")) - mkv_write_simpletag(s->pb, t); + av_strcasecmp(t->key, "encoding_tool")) { + ret = mkv_write_simpletag(s->pb, t); + if (ret < 0) + return ret; + } + } end_ebml_master(s->pb, tag); return 0; diff --git a/libavutil/opt.c b/libavutil/opt.c index 28adef6877..6785a08741 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -138,7 +138,7 @@ static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **d { av_freep(dst); *dst = av_strdup(val); - return 0; + return *dst ? 0 : AVERROR(ENOMEM); } #define DEFAULT_NUMVAL(opt) ((opt->type == AV_OPT_TYPE_INT64 || \ @@ -350,7 +350,7 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) *out_val = av_strdup(*(uint8_t**)dst); else *out_val = av_strdup(""); - return 0; + return *out_val ? 0 : AVERROR(ENOMEM); case AV_OPT_TYPE_BINARY: len = *(int*)(((uint8_t *)dst) + sizeof(uint8_t *)); if ((uint64_t)len*2 + 1 > INT_MAX) @@ -368,7 +368,7 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) if (ret >= sizeof(buf)) return AVERROR(EINVAL); *out_val = av_strdup(buf); - return 0; + return *out_val ? 0 : AVERROR(ENOMEM); } static int get_number(void *obj, const char *name, double *num, int *den, int64_t *intnum, @@ -828,6 +828,8 @@ int main(void) test_ctx.class = &test_class; av_opt_set_defaults(&test_ctx); test_ctx.string = av_strdup("default"); + if (!test_ctx.string) + return AVERROR(ENOMEM); av_log_set_level(AV_LOG_DEBUG); -- cgit v1.2.3