Ensure critial sections are released before returning
authorРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 31 Jul 2014 10:12:59 +0000 (10:12 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 31 Jul 2014 10:39:54 +0000 (10:39 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=734035

gio/gregistrysettingsbackend.c

index 396159c..cf9da0b 100644 (file)
@@ -1754,8 +1754,12 @@ watch_add_notify (GRegistryBackend *self,
   EnterCriticalSection (self->cache_lock);
   cache_node = registry_cache_get_node_for_key (self->cache_root, gsettings_prefix, TRUE);
 
-  g_return_val_if_fail (cache_node != NULL, FALSE);
-  g_return_val_if_fail (cache_node->data != NULL, FALSE);
+  if (cache_node == NULL || cache_node->data == NULL)
+    {
+      LeaveCriticalSection (self->cache_lock);
+      g_warn_if_reached ();
+      return FALSE;
+    }
   
   cache_item = cache_node->data;
 
@@ -1764,6 +1768,7 @@ watch_add_notify (GRegistryBackend *self,
     {
       trace ("watch_add_notify: prefix %s already watched, %i subscribers.\n",
              gsettings_prefix, cache_item->subscription_count);
+      LeaveCriticalSection (self->cache_lock);
       return FALSE;
     }