diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c index 342a6b9ba..0519713c5 100644 --- a/gio/gnetworkaddress.c +++ b/gio/gnetworkaddress.c @@ -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 / ":" ) diff --git a/gio/tests/network-address.c b/gio/tests/network-address.c index a8be41556..ac4842c23 100644 --- a/gio/tests/network-address.c +++ b/gio/tests/network-address.c @@ -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