glvideomixer: fix race retrieving the GL context from the display
authorMatthew Waters <matthew@centricular.com>
Tue, 24 May 2016 13:39:27 +0000 (23:39 +1000)
committerMatthew Waters <matthew@centricular.com>
Wed, 25 May 2016 08:28:20 +0000 (18:28 +1000)
_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

index 9d2851e..410a420 100644 (file)
@@ -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);