mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 21:51:09 +00:00
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:
parent
eee8b0db88
commit
4036f210af
1 changed files with 2 additions and 9 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue