mssdemux: add conditions to prevent some crashes
authorLouis-Francis Ratté-Boulianne <louis-francis.ratte-boulianne@collabora.co.uk>
Fri, 1 Feb 2013 22:43:46 +0000 (17:43 -0500)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Wed, 8 May 2013 00:09:47 +0000 (21:09 -0300)
ext/smoothstreaming/gstmssmanifest.c

index 8cfc544..56d670a 100644 (file)
@@ -141,7 +141,6 @@ _gst_mss_stream_init (GstMssStream * stream, xmlNodePtr node)
   GstMssStreamFragment *previous_fragment = NULL;
   guint fragment_number = 0;
   guint64 fragment_time_accum = 0;
-  GError *gerror = NULL;
 
   stream->xmlnode = node;
 
@@ -212,8 +211,8 @@ _gst_mss_stream_init (GstMssStream * stream, xmlNodePtr node)
   stream->current_fragment = stream->fragments;
   stream->current_quality = stream->qualities;
 
-  stream->regex_bitrate = g_regex_new ("\\{[Bb]itrate\\}", 0, 0, &gerror);
-  stream->regex_position = g_regex_new ("\\{start[ _]time\\}", 0, 0, &gerror);
+  stream->regex_bitrate = g_regex_new ("\\{[Bb]itrate\\}", 0, 0, NULL);
+  stream->regex_position = g_regex_new ("\\{start[ _]time\\}", 0, 0, NULL);
 }
 
 GstMssManifest *
@@ -284,6 +283,9 @@ gst_mss_stream_get_type (GstMssStream * stream)
   gchar *prop = (gchar *) xmlGetProp (stream->xmlnode, (xmlChar *) "Type");
   GstMssStreamType ret = MSS_STREAM_TYPE_UNKNOWN;
 
+  if (prop == NULL)
+    return MSS_STREAM_TYPE_UNKNOWN;
+
   if (strcmp (prop, "video") == 0) {
     ret = MSS_STREAM_TYPE_VIDEO;
   } else if (strcmp (prop, "audio") == 0) {
@@ -335,6 +337,9 @@ _make_h264_codec_data (GstBuffer * sps, GstBuffer * pps)
   guint8 *data;
   gint nl;
 
+  if (GST_BUFFER_SIZE (sps) < 4)
+    return NULL;
+
   sps_size += GST_BUFFER_SIZE (sps) + 2;
   profile_idc = GST_BUFFER_DATA (sps)[1];
   profile_comp = GST_BUFFER_DATA (sps)[2];
@@ -426,8 +431,10 @@ _gst_mss_stream_add_h264_codec_data (GstCaps * caps, const gchar * codecdatastr)
   g_value_reset (&sps_value);
   g_value_reset (&pps_value);
 
-  gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL);
-  gst_buffer_unref (buffer);
+  if (buffer != NULL) {
+    gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL);
+    gst_buffer_unref (buffer);
+  }
 }
 
 static GstCaps *
@@ -704,6 +711,10 @@ gst_mss_stream_get_fragment_url (GstMssStream * stream, gchar ** url)
 
   g_free (tmp);
   g_free (start_time_str);
+
+  if (*url == NULL)
+    return GST_FLOW_ERROR;
+
   return GST_FLOW_OK;
 }