Steve Lhomme pushed to branch 3.0.x at VideoLAN / VLC
Commits: 42f00e18 by Steve Lhomme at 2021-09-07T11:16:47+00:00 contrib: ffmpeg: avoid using uninitialized mutex/condition in VP9 Fixes #26017 (cherry picked from commit 679a3c9c94fe78e2901c9d426e6aa6a1e332c2ed) (edited) edited: - the 3.0 branch had extra patches Signed-off-by: Steve Lhomme <[email protected]> - - - - - 2 changed files: - + contrib/src/ffmpeg/0001-avcodec-vp9-Do-not-destroy-uninitialized-mutexes-con.patch - contrib/src/ffmpeg/rules.mak Changes: ===================================== contrib/src/ffmpeg/0001-avcodec-vp9-Do-not-destroy-uninitialized-mutexes-con.patch ===================================== @@ -0,0 +1,74 @@ +From e337ba0bce7595366e417b4eed8c2c321726bd87 Mon Sep 17 00:00:00 2001 +From: Andreas Rheinhardt <[email protected]> +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 <[email protected]> +Signed-off-by: Andreas Rheinhardt <[email protected]> +--- + 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 + ===================================== contrib/src/ffmpeg/rules.mak ===================================== @@ -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 View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/42f00e185478ada296dbcba942c4c0928667f1b3 -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/42f00e185478ada296dbcba942c4c0928667f1b3 You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
