From a183ffbee12490b2a2b24718ec95219874bf556f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 10 Mar 2014 16:27:48 +0100 Subject: [PATCH] networkaddress: fix parsing of uri with @ after authority 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 | 11 +++++++++-- gio/tests/network-address.c | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) 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