From 620af5b04b0d3daac056d99b7dac9cbb2467d478 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Sat, 1 Aug 2015 15:52:28 -0300 Subject: [PATCH] dash: mpdparser: plug leak in segmenttemplate parsing Only copy the values from the parent if the current node doesn't have that value, they were being copied from the parent and then overwriten by the child node, leaking the parent's copy --- ext/dash/gstmpdparser.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index 83f6b9179d..c588142fc7 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -1607,33 +1607,37 @@ gst_mpdparser_parse_segment_template_node (GstSegmentTemplateNode ** pointer, gst_mpdparser_free_segment_template_node (*pointer); *pointer = new_segment_template = g_slice_new0 (GstSegmentTemplateNode); - /* Inherit attribute values from parent */ - if (parent) { - new_segment_template->media = xmlMemStrdup (parent->media); - new_segment_template->index = xmlMemStrdup (parent->index); - new_segment_template->initialization = - xmlMemStrdup (parent->initialization); - new_segment_template->bitstreamSwitching = - xmlMemStrdup (parent->bitstreamSwitching); - } - GST_LOG ("extension of SegmentTemplate node:"); gst_mpdparser_parse_mult_seg_base_type_ext (&new_segment_template->MultSegBaseType, a_node, (parent ? parent->MultSegBaseType : NULL)); + /* Inherit attribute values from parent when the value isn't found */ GST_LOG ("attributes of SegmentTemplate node:"); if (gst_mpdparser_get_xml_prop_string (a_node, "media", &strval)) { new_segment_template->media = strval; + } else if (parent) { + new_segment_template->media = xmlMemStrdup (parent->media); } + if (gst_mpdparser_get_xml_prop_string (a_node, "index", &strval)) { new_segment_template->index = strval; + } else if (parent) { + new_segment_template->index = xmlMemStrdup (parent->index); } + if (gst_mpdparser_get_xml_prop_string (a_node, "initialization", &strval)) { new_segment_template->initialization = strval; + } else if (parent) { + new_segment_template->initialization = + xmlMemStrdup (parent->initialization); } + if (gst_mpdparser_get_xml_prop_string (a_node, "bitstreamSwitching", &strval)) { new_segment_template->bitstreamSwitching = strval; + } else if (parent) { + new_segment_template->bitstreamSwitching = + xmlMemStrdup (parent->bitstreamSwitching); } }