From: Matthew Waters Date: Tue, 24 May 2016 13:39:27 +0000 (+1000) Subject: glvideomixer: fix race retrieving the GL context from the display X-Git-Tag: 1.19.3~511^2~1294^2~118 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=11bb4454a8ba60637fb224cdb944c58a0610f5d2;p=platform%2Fupstream%2Fgstreamer.git 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 --- 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);