mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 18:20:44 +00:00
discoverer: fix potential tag list leaks
Not that I have ever seen these in practice, but if they can't happen we may just as well just assign the new tag list. Merge properly to be on the safe side, and also avoid a useless tag list copy in the normal case where there is no tag list yet.
This commit is contained in:
parent
b794f78d26
commit
5f20af6ce5
1 changed files with 25 additions and 15 deletions
|
@ -607,6 +607,23 @@ collect_stream_information (GstDiscoverer * dc, PrivateStream * ps, guint idx)
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* takes ownership of new_tags, may replace *taglist with a new one */
|
||||||
|
static void
|
||||||
|
gst_discoverer_merge_and_replace_tags (GstTagList ** taglist,
|
||||||
|
GstTagList * new_tags)
|
||||||
|
{
|
||||||
|
if (new_tags == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (*taglist == NULL) {
|
||||||
|
*taglist = new_tags;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_tag_list_insert (*taglist, new_tags, GST_TAG_MERGE_REPLACE);
|
||||||
|
gst_tag_list_free (new_tags);
|
||||||
|
}
|
||||||
|
|
||||||
/* Parses a set of caps and tags in st and populates a GstDiscovererStreamInfo
|
/* Parses a set of caps and tags in st and populates a GstDiscovererStreamInfo
|
||||||
* structure (parent, if !NULL, otherwise it allocates one)
|
* structure (parent, if !NULL, otherwise it allocates one)
|
||||||
*/
|
*/
|
||||||
|
@ -664,10 +681,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
info->max_bitrate = utmp;
|
info->max_bitrate = utmp;
|
||||||
|
|
||||||
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
||||||
info->parent.tags = gst_tag_list_merge (info->parent.tags,
|
gst_discoverer_merge_and_replace_tags (&info->parent.tags,
|
||||||
(GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
|
(GstTagList *) tags_st);
|
||||||
|
|
||||||
gst_structure_free (tags_st);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
|
if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
|
||||||
|
@ -728,9 +743,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
info->max_bitrate = utmp;
|
info->max_bitrate = utmp;
|
||||||
|
|
||||||
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
||||||
info->parent.tags = gst_tag_list_merge (info->parent.tags,
|
gst_discoverer_merge_and_replace_tags (&info->parent.tags,
|
||||||
(GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
|
(GstTagList *) tags_st);
|
||||||
gst_structure_free (tags_st);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (GstDiscovererStreamInfo *) info;
|
return (GstDiscovererStreamInfo *) info;
|
||||||
|
@ -757,10 +771,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
info->language = g_strdup (language);
|
info->language = g_strdup (language);
|
||||||
|
|
||||||
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
/* FIXME: Is it worth it to remove the tags we've parsed? */
|
||||||
info->parent.tags = gst_tag_list_merge (info->parent.tags,
|
gst_discoverer_merge_and_replace_tags (&info->parent.tags,
|
||||||
(GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
|
(GstTagList *) tags_st);
|
||||||
gst_structure_free (tags_st);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
|
if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
|
||||||
|
@ -787,9 +799,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
|
|
||||||
if (gst_structure_id_get (st, _TAGS_QUARK,
|
if (gst_structure_id_get (st, _TAGS_QUARK,
|
||||||
GST_TYPE_STRUCTURE, &tags_st, NULL)) {
|
GST_TYPE_STRUCTURE, &tags_st, NULL)) {
|
||||||
info->tags = gst_tag_list_merge (info->tags, (GstTagList *) tags_st,
|
gst_discoverer_merge_and_replace_tags (&info->tags,
|
||||||
GST_TAG_MERGE_REPLACE);
|
(GstTagList *) tags_st);
|
||||||
gst_structure_free (tags_st);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
|
@ -1197,7 +1208,6 @@ handle_current_sync (GstDiscoverer * dc)
|
||||||
done = handle_message (dc, msg);
|
done = handle_message (dc, msg);
|
||||||
gst_message_unref (msg);
|
gst_message_unref (msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (!done && (g_timer_elapsed (timer, NULL) < deadline));
|
} while (!done && (g_timer_elapsed (timer, NULL) < deadline));
|
||||||
|
|
||||||
/* return result */
|
/* return result */
|
||||||
|
|
Loading…
Reference in a new issue