diff options
author | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-12-10 22:44:13 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@outlook.com> | 2021-12-16 02:37:26 +0100 |
commit | 077167fab9067c606c374e0fd26930f78465387b (patch) | |
tree | f960a7bc2c592b47e3845f2d81997dd5730af279 /libavcodec/xsubdec.c | |
parent | 2adbb0c2af2cc42a25ab58ef0d4837245f0fbf62 (diff) | |
download | ffmpeg-077167fab9067c606c374e0fd26930f78465387b.tar.gz |
avcodec/xsubdec: Cleanup generically upon allocation error
This is possible by incrementing the counter of allocated rects
directly after said allocation succeeded.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec/xsubdec.c')
-rw-r--r-- | libavcodec/xsubdec.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/libavcodec/xsubdec.c b/libavcodec/xsubdec.c index 979399bae6..b483699d0a 100644 --- a/libavcodec/xsubdec.c +++ b/libavcodec/xsubdec.c @@ -101,10 +101,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, return AVERROR(ENOMEM); sub->rects[0] = av_mallocz(sizeof(*sub->rects[0])); - if (!sub->rects[0]) { - av_freep(&sub->rects); + if (!sub->rects[0]) return AVERROR(ENOMEM); - } + sub->num_rects = 1; sub->rects[0]->x = x; sub->rects[0]->y = y; sub->rects[0]->w = w; sub->rects[0]->h = h; sub->rects[0]->type = SUBTITLE_BITMAP; @@ -112,14 +111,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, sub->rects[0]->data[0] = av_malloc(w * h); sub->rects[0]->nb_colors = 4; sub->rects[0]->data[1] = av_mallocz(AVPALETTE_SIZE); - if (!sub->rects[0]->data[0] || !sub->rects[0]->data[1]) { - av_freep(&sub->rects[0]->data[1]); - av_freep(&sub->rects[0]->data[0]); - av_freep(&sub->rects[0]); - av_freep(&sub->rects); + if (!sub->rects[0]->data[0] || !sub->rects[0]->data[1]) return AVERROR(ENOMEM); - } - sub->num_rects = 1; // read palette for (i = 0; i < sub->rects[0]->nb_colors; i++) |