permissions: Fix refcounting when adding/removing roles
authorSebastian Rasmussen <sebras@hotmail.com>
Sat, 19 Oct 2013 15:39:35 +0000 (17:39 +0200)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 12 Nov 2013 08:54:04 +0000 (09:54 +0100)
Previously a role that was removed was unreffed twice, and when
replacing an existing role the replaced role was freed while still being
referenced. Both bugs are now fixed.

See https://bugzilla.gnome.org/show_bug.cgi?id=710202

gst/rtsp-server/rtsp-permissions.c

index 25872c65c17ee2af040aec43e6eb30b28022401e..ae60b962ddebed8c7b7fcfde58da42eda4a48e3d 100644 (file)
@@ -161,7 +161,6 @@ gst_rtsp_permissions_add_role_valist (GstRTSPPermissions * permissions,
   GstRTSPPermissionsImpl *impl = (GstRTSPPermissionsImpl *) permissions;
   GstStructure *structure;
   guint i, len;
-  gboolean found;
 
   g_return_if_fail (GST_IS_RTSP_PERMISSIONS (permissions));
   g_return_if_fail (gst_mini_object_is_writable (&permissions->mini_object));
@@ -172,23 +171,18 @@ gst_rtsp_permissions_add_role_valist (GstRTSPPermissions * permissions,
   g_return_if_fail (structure != NULL);
 
   len = impl->roles->len;
-  found = FALSE;
   for (i = 0; i < len; i++) {
     GstStructure *entry = g_ptr_array_index (impl->roles, i);
 
     if (gst_structure_has_name (entry, role)) {
-      gst_structure_free (entry);
-      found = TRUE;
+      g_ptr_array_remove_index_fast (impl->roles, i);
       break;
     }
   }
 
   gst_structure_set_parent_refcount (structure,
       &impl->permissions.mini_object.refcount);
-  if (!found)
-    g_ptr_array_add (impl->roles, structure);
-  else
-    g_ptr_array_index (impl->roles, i) = structure;
+  g_ptr_array_add (impl->roles, structure);
 }
 
 /**
@@ -215,7 +209,6 @@ gst_rtsp_permissions_remove_role (GstRTSPPermissions * permissions,
 
     if (gst_structure_has_name (entry, role)) {
       g_ptr_array_remove_index_fast (impl->roles, i);
-      gst_structure_free (entry);
       break;
     }
   }