permissions: Fix refcounting when adding/removing roles

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
This commit is contained in:
Sebastian Rasmussen 2013-10-19 17:39:35 +02:00 committed by Wim Taymans
parent eee8b0db88
commit 4036f210af

View file

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