networkaddress: fix parsing of uri with @ after authority
authorWim Taymans <wtaymans@redhat.com>
Mon, 10 Mar 2014 15:27:48 +0000 (16:27 +0100)
committerDan Winship <danw@gnome.org>
Wed, 2 Apr 2014 15:23:29 +0000 (11:23 -0400)
Make sure that the @ sign is inside the authority part before attempting
to parse the userinfo. We do this by checking if the @ sign comes before
any of the possible authority delimiters.
Add unit test to verify parsing of ftp://ftp.gnome.org/start?foo=bar@baz

https://bugzilla.gnome.org/show_bug.cgi?id=726040

gio/gnetworkaddress.c
gio/tests/network-address.c

index 342a6b9..0519713 100644 (file)
@@ -453,7 +453,7 @@ _g_uri_parse_authority (const char  *uri,
                        char       **userinfo)
 {
   char *tmp_str;
-  const char *start, *p;
+  const char *start, *p, *at, *delim;
   char c;
 
   g_return_val_if_fail (uri != NULL, FALSE);
@@ -493,7 +493,14 @@ _g_uri_parse_authority (const char  *uri,
 
   start += 2;
 
-  if (strchr (start, '@') != NULL)
+  /* check if the @ sign is part of the authority before attempting to
+   * decode the userinfo */
+  delim = strpbrk (start, "/?#[]");
+  at = strchr (start, '@');
+  if (at && delim && at > delim)
+    at = NULL;
+
+  if (at != NULL)
     {
       /* Decode userinfo:
        * userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
index a8be415..ac4842c 100644 (file)
@@ -42,7 +42,8 @@ static ParseTest uri_tests[] = {
   { "http://[fec0::abcd%em1]/start", "http", "fec0::abcd%em1", 8080, -1 },
   { "http://[fec0::abcd%25em1]/start", "http", "fec0::abcd%em1", 8080, -1 },
   { "http://[fec0::abcd%10]/start", "http", "fec0::abcd%10", 8080, -1 },
-  { "http://[fec0::abcd%25em%31]/start", NULL, NULL, 0, G_IO_ERROR_INVALID_ARGUMENT }
+  { "http://[fec0::abcd%25em%31]/start", NULL, NULL, 0, G_IO_ERROR_INVALID_ARGUMENT },
+  { "ftp://ftp.gnome.org/start?foo=bar@baz", "ftp", "ftp.gnome.org", 8080, -1 }
 };
 
 static void