gst/rtsp/rtspurl.c: Make parsing of urls suck slightly less.
authorWim Taymans <wim.taymans@gmail.com>
Mon, 8 May 2006 14:35:20 +0000 (14:35 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 8 May 2006 14:35:20 +0000 (14:35 +0000)
Original commit message from CVS:
* gst/rtsp/rtspurl.c: (rtsp_url_parse):
Make parsing of urls suck slightly less.

ChangeLog
gst/rtsp/rtspurl.c

index 5bd3111..5e6cfb2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-05-08  Wim Taymans  <wim@fluendo.com>
+
+       * gst/rtsp/rtspurl.c: (rtsp_url_parse):
+       Make parsing of urls suck slightly less.
+
 2006-05-08  Edward Hervey  <edward@fluendo.com>
 
        * autogen.sh: (CONFIGURE_DEF_OPT): 
index da7a879..2f67560 100644 (file)
@@ -37,7 +37,7 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
   res = g_new0 (RTSPUrl, 1);
 
   if (urlstr == NULL)
-    return RTSP_EINVAL;
+    goto invalid;
 
   p = (gchar *) urlstr;
   if (g_str_has_prefix (p, RTSP_PROTO)) {
@@ -46,30 +46,31 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
   } else if (g_str_has_prefix (p, RTSPU_PROTO)) {
     res->protocol = RTSP_PROTO_UDP;
     p += RTSPU_PROTO_LEN;
-  } else {
-    return RTSP_EINVAL;
-  }
+  } else
+    goto invalid;
 
   slash = strstr (p, "/");
-  at = g_strrstr (p, "@");
+  at = strstr (p, "@");
 
   if (at && slash && at > slash)
     at = NULL;
 
   if (at) {
-    col = g_strrstr (p, ":");
+    col = strstr (p, ":");
 
-    if (col == NULL)
-      return RTSP_EINVAL;
+    /* must have a ':' and it must be before the '@' */
+    if (col == NULL || col > at)
+      goto invalid;
 
     res->user = g_strndup (p, col - p);
     col++;
     res->passwd = g_strndup (col, col - at);
 
+    /* move to host */
     p = at + 1;
   }
 
-  col = g_strrstr (p, ":");
+  col = strstr (p, ":");
   if (col) {
     res->host = g_strndup (p, col - p);
     p = col + 1;
@@ -92,6 +93,12 @@ rtsp_url_parse (const gchar * urlstr, RTSPUrl ** url)
   *url = res;
 
   return RTSP_OK;
+
+invalid:
+  {
+    rtsp_url_free (res);
+    return RTSP_EINVAL;
+  }
 }
 
 void