summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2012-01-10 18:07:19 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2012-01-10 18:29:21 +0000
commit5f20af6ce537c2b079ca866ccd5dea589ea1be5f (patch)
tree8488ddb79db695c50bd9bd489ca264553b6e0e3a
parentb794f78d267737c3c4b8ce58370c3182d403a28a (diff)
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.
-rw-r--r--gst-libs/gst/pbutils/gstdiscoverer.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c
index a7c49681b..6291cd7c9 100644
--- a/gst-libs/gst/pbutils/gstdiscoverer.c
+++ b/gst-libs/gst/pbutils/gstdiscoverer.c
@@ -607,6 +607,23 @@ collect_stream_information (GstDiscoverer * dc, PrivateStream * ps, guint idx)
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
* structure (parent, if !NULL, otherwise it allocates one)
*/
@@ -664,10 +681,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
info->max_bitrate = utmp;
/* FIXME: Is it worth it to remove the tags we've parsed? */
- info->parent.tags = gst_tag_list_merge (info->parent.tags,
- (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
-
- gst_structure_free (tags_st);
+ gst_discoverer_merge_and_replace_tags (&info->parent.tags,
+ (GstTagList *) tags_st);
}
if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
@@ -728,9 +743,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
info->max_bitrate = utmp;
/* FIXME: Is it worth it to remove the tags we've parsed? */
- info->parent.tags = gst_tag_list_merge (info->parent.tags,
- (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
- gst_structure_free (tags_st);
+ gst_discoverer_merge_and_replace_tags (&info->parent.tags,
+ (GstTagList *) tags_st);
}
return (GstDiscovererStreamInfo *) info;
@@ -757,10 +771,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
info->language = g_strdup (language);
/* FIXME: Is it worth it to remove the tags we've parsed? */
- info->parent.tags = gst_tag_list_merge (info->parent.tags,
- (GstTagList *) tags_st, GST_TAG_MERGE_REPLACE);
- gst_structure_free (tags_st);
-
+ gst_discoverer_merge_and_replace_tags (&info->parent.tags,
+ (GstTagList *) tags_st);
}
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,
GST_TYPE_STRUCTURE, &tags_st, NULL)) {
- info->tags = gst_tag_list_merge (info->tags, (GstTagList *) tags_st,
- GST_TAG_MERGE_REPLACE);
- gst_structure_free (tags_st);
+ gst_discoverer_merge_and_replace_tags (&info->tags,
+ (GstTagList *) tags_st);
}
return info;
@@ -1197,7 +1208,6 @@ handle_current_sync (GstDiscoverer * dc)
done = handle_message (dc, msg);
gst_message_unref (msg);
}
-
} while (!done && (g_timer_elapsed (timer, NULL) < deadline));
/* return result */