From 11bb4454a8ba60637fb224cdb944c58a0610f5d2 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 24 May 2016 23:39:27 +1000 Subject: [PATCH] glvideomixer: fix race retrieving the GL context from the display _get_gl_context() can be called concurrently from either propose_allocation() or decide_allocation(). If it so happens that this happens at the same time, the check for whether we already had a GL context was outside the lock. Inside the lock and loop, the first thing that happens is that we unref the current GL context (if valid) as if there was a conflict adding it to the display. If the timing was unlucky, subsequent use of the GL context would be referencing an already unreffed GL context object resulting in a critical: g_object_ref: assertion 'object->ref_count > 0' failed https://bugzilla.gnome.org/show_bug.cgi?id=766703 --- ext/gl/gstglbasemixer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/gl/gstglbasemixer.c b/ext/gl/gstglbasemixer.c index 9d2851e..410a420 100644 --- a/ext/gl/gstglbasemixer.c +++ b/ext/gl/gstglbasemixer.c @@ -195,8 +195,8 @@ _get_gl_context (GstGLBaseMixer * mix) _find_local_gl_context (mix); + GST_OBJECT_LOCK (mix->display); if (!mix->context) { - GST_OBJECT_LOCK (mix->display); do { if (mix->context) { gst_object_unref (mix->context); @@ -213,8 +213,8 @@ _get_gl_context (GstGLBaseMixer * mix) } } } while (!gst_gl_display_add_context (mix->display, mix->context)); - GST_OBJECT_UNLOCK (mix->display); } + GST_OBJECT_UNLOCK (mix->display); { GstGLAPI current_gl_api = gst_gl_context_get_gl_api (mix->context); -- 2.7.4