bus: Don't allow removing signal watches with gst_bus_remove_watch()
authorSebastian Dröge <sebastian@centricular.com>
Fri, 15 Feb 2019 11:20:27 +0000 (13:20 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 15 Feb 2019 11:21:35 +0000 (13:21 +0200)
Signal watches are reference counted and gst_bus_remove_watch() would
immediately remove it, breaking the reference counting. Only
gst_bus_remove_signal_watch() should be used for removing signal
watches.

gst/gstbus.c

index df2351f..15e14e3 100644 (file)
@@ -1052,7 +1052,13 @@ gst_bus_remove_watch (GstBus * bus)
 
   if (bus->priv->signal_watch == NULL) {
     GST_ERROR_OBJECT (bus, "no bus watch was present");
-    goto no_watch;
+    goto error;
+  }
+
+  if (bus->priv->num_signal_watchers > 0) {
+    GST_ERROR_OBJECT (bus,
+        "trying to remove signal watch with gst_bus_remove_watch()");
+    goto error;
   }
 
   watch_id = bus->priv->signal_watch;
@@ -1063,7 +1069,7 @@ gst_bus_remove_watch (GstBus * bus)
 
   return TRUE;
 
-no_watch:
+error:
   GST_OBJECT_UNLOCK (bus);
 
   return FALSE;