X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Futils.c;h=26343175ffdcaa4274a9fe941d98c807fdd153e3;hb=0b8df0ce48e6e3d3263f20ec0ce20fe72bdae318;hp=56646464b680f941c58a6fe12772983d191e47f6;hpb=7c282d0c758dc5e9593312da1c191cdf76de0303;p=ffmpeg diff --git a/libavformat/utils.c b/libavformat/utils.c index 56646464b68..26343175ffd 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -5104,15 +5104,11 @@ uint8_t *av_stream_get_side_data(const AVStream *st, return NULL; } -uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, - int size) +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size) { AVPacketSideData *sd, *tmp; int i; - uint8_t *data = av_malloc(size); - - if (!data) - return NULL; for (i = 0; i < st->nb_side_data; i++) { sd = &st->side_data[i]; @@ -5121,14 +5117,16 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, av_freep(&sd->data); sd->data = data; sd->size = size; - return sd->data; + return 0; } } - tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp)); + if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data)) + return AVERROR(ERANGE); + + tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp)); if (!tmp) { - av_freep(&data); - return NULL; + return AVERROR(ENOMEM); } st->side_data = tmp; @@ -5138,6 +5136,25 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, sd->type = type; sd->data = data; sd->size = size; + + return 0; +} + +uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, + int size) +{ + int ret; + uint8_t *data = av_malloc(size); + + if (!data) + return NULL; + + ret = av_stream_add_side_data(st, type, data, size); + if (ret < 0) { + av_freep(&data); + return NULL; + } + return data; }