Skip to content
Snippets Groups Projects
Commit 42f00e18 authored by Steve Lhomme's avatar Steve Lhomme
Browse files

contrib: ffmpeg: avoid using uninitialized mutex/condition in VP9


Fixes #26017

(cherry picked from commit 679a3c9c) (edited)
edited:
- the 3.0 branch had extra patches

Signed-off-by: default avatarSteve Lhomme <robux4@ycbcr.xyz>
parent a63f30d2
No related branches found
No related tags found
2 merge requests!3533Backport MR 3236 to 3.0.x,!581[3.0] contrib: ffmpeg: avoid using uninitialized mutex/condition in VP9
Pipeline #136013 passed with stages
in 21 minutes and 45 seconds
From e337ba0bce7595366e417b4eed8c2c321726bd87 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Thu, 2 Sep 2021 17:34:35 +0200
Subject: [PATCH] avcodec/vp9: Do not destroy uninitialized mutexes/conditions
Also do not destroy and reinitialize mutexes and conditions when
certain input parameters change. Given that the decoder did not
create these variables at all during init, uninitialized mutexes
and conditions are destroyed before the very first initialization.
This is undefined behaviour and certain threading implementations
like pthreadGC2 crash when it is attempted.
Fix this by initializing these objects once during init and freeing
them in close.
Reported-by: Steve Lhomme <robux4@ycbcr.xyz>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavcodec/vp9.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
index 4659f94ee8..1bdaba0aef 100644
--- a/libavcodec/vp9.c
+++ b/libavcodec/vp9.c
@@ -43,8 +43,6 @@ static void vp9_free_entries(AVCodecContext *avctx) {
VP9Context *s = avctx->priv_data;
if (avctx->active_thread_type & FF_THREAD_SLICE) {
- pthread_mutex_destroy(&s->progress_mutex);
- pthread_cond_destroy(&s->progress_cond);
av_freep(&s->entries);
}
}
@@ -66,9 +64,6 @@ static int vp9_alloc_entries(AVCodecContext *avctx, int n) {
for (i = 0; i < n; i++)
atomic_init(&s->entries[i], 0);
-
- pthread_mutex_init(&s->progress_mutex, NULL);
- pthread_cond_init(&s->progress_cond, NULL);
}
return 0;
}
@@ -1252,6 +1247,12 @@ static av_cold int vp9_decode_free(AVCodecContext *avctx)
free_buffers(s);
vp9_free_entries(avctx);
+#if HAVE_THREADS
+ if (avctx->active_thread_type & FF_THREAD_SLICE) {
+ pthread_mutex_destroy(&s->progress_mutex);
+ pthread_cond_destroy(&s->progress_cond);
+ }
+#endif
av_freep(&s->td);
return 0;
}
@@ -1800,6 +1801,13 @@ static int init_frames(AVCodecContext *avctx)
VP9Context *s = avctx->priv_data;
int i;
+#if HAVE_THREADS
+ if (avctx->active_thread_type & FF_THREAD_SLICE) {
+ pthread_mutex_init(&s->progress_mutex, NULL);
+ pthread_cond_init(&s->progress_cond, NULL);
+ }
+#endif
+
for (i = 0; i < 3; i++) {
s->s.frames[i].tf.f = av_frame_alloc();
if (!s->s.frames[i].tf.f) {
--
2.27.0.windows.1
......@@ -238,6 +238,7 @@ ifdef USE_FFMPEG
$(APPLY) $(SRC)/ffmpeg/0002-avcodec-mpeg12dec-don-t-end-a-slice-without-first_sl.patch
$(APPLY) $(SRC)/ffmpeg/0001-fix-MediaFoundation-compilation-if-WINVER-was-forced.patch
$(APPLY) $(SRC)/ffmpeg/0001-bring-back-XP-support.patch
$(APPLY) $(SRC)/ffmpeg/0001-avcodec-vp9-Do-not-destroy-uninitialized-mutexes-con.patch
endif
ifdef USE_LIBAV
$(APPLY) $(SRC)/ffmpeg/libav_gsm.patch
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment