Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanne Grunau <janne-vlc@jannau.net>2018-10-03 15:38:44 +0300
committerJean-Baptiste Kempf <jb@videolan.org>2018-10-03 16:51:43 +0300
commit47886aed9f041eaa484460893ba6bdd77f270ee7 (patch)
tree5828da5fa0c9ec0f58dfe83092e0613b239d1b72 /src/decode.c
parent914bf5843f6d52cdca135ab5c4e70ed85f56d54a (diff)
decode_frame: unref everything on decoding errors
Fixes frame ref leak with crash-5f55445c56a36f28259bc742dd08b2c5ba42045d.
Diffstat (limited to 'src/decode.c')
-rw-r--r--src/decode.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/src/decode.c b/src/decode.c
index 7a39f82..e15472f 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -2237,6 +2237,7 @@ int decode_tile_sbrow(Dav1dTileContext *const t) {
int decode_frame(Dav1dFrameContext *const f) {
const Dav1dContext *const c = f->c;
+ int retval = -EINVAL;
if (f->n_tc > 1) {
if (f->frame_hdr.tiling.cols * f->sbh > f->tile_thread.titsati_sz) {
@@ -2650,6 +2651,8 @@ int decode_frame(Dav1dFrameContext *const f) {
dav1d_thread_picture_signal(&f->cur, UINT_MAX, PLANE_TYPE_ALL);
+ retval = 0;
+error:
for (int i = 0; i < 7; i++) {
if (f->refp[i].p.data[0])
dav1d_thread_picture_unref(&f->refp[i]);
@@ -2668,13 +2671,7 @@ int decode_frame(Dav1dFrameContext *const f) {
for (int i = 0; i < f->n_tile_data; i++)
dav1d_data_unref(&f->tile[i].data);
- return 0;
-
-error:
- for (int i = 0; i < f->n_tile_data; i++)
- dav1d_data_unref(&f->tile[i].data);
-
- return -EINVAL;
+ return retval;
}
int submit_frame(Dav1dContext *const c) {