[FFmpeg-devel] [PATCH] Reset mutex to NULL after mutex destruction.

Manfred Georg mgeorg at google.com
Mon Sep 29 23:41:38 CEST 2014


A badly behaving user provided mutex manager (such as that in OpenCV) may not reset the mutex to NULL on destruction.  This can cause a problem for a later mutex manager (which may assert that the mutex is NULL before creating).
---
 libavcodec/utils.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 9eb2b5b..a1f7cfc 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -3457,18 +3457,21 @@ AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel)
 int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
 {
     if (lockmgr_cb) {
-        if (lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY))
-            return -1;
-        if (lockmgr_cb(&avformat_mutex, AV_LOCK_DESTROY))
+        void *old_codec_mutex = codec_mutex;
+        void *old_avformat_mutex = avformat_mutex;
+        int failure;
+        codec_mutex = NULL;
+        avformat_mutex = NULL;
+        failure = lockmgr_cb(&old_codec_mutex, AV_LOCK_DESTROY);
+        if (lockmgr_cb(&old_avformat_mutex, AV_LOCK_DESTROY) || failure)
             return -1;
     }
 
     lockmgr_cb = cb;
 
     if (lockmgr_cb) {
-        if (lockmgr_cb(&codec_mutex, AV_LOCK_CREATE))
-            return -1;
-        if (lockmgr_cb(&avformat_mutex, AV_LOCK_CREATE))
+        int failure = lockmgr_cb(&codec_mutex, AV_LOCK_CREATE);
+        if (lockmgr_cb(&avformat_mutex, AV_LOCK_CREATE) || failure)
             return -1;
     }
     return 0;
-- 
2.1.0.rc2.206.gedb03e5



More information about the ffmpeg-devel mailing list