From: Zhiyi Zhang <zzhang@codeweavers.com> --- dlls/iertutil/uri.c | 8 ++++- dlls/urlmon/tests/uri.c | 78 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/dlls/iertutil/uri.c b/dlls/iertutil/uri.c index a2ec466dd0e..4797e12642f 100644 --- a/dlls/iertutil/uri.c +++ b/dlls/iertutil/uri.c @@ -1173,9 +1173,9 @@ static BOOL parse_port(const WCHAR **ptr, parse_data *data) { ++(*ptr); } - data->has_port = TRUE; data->port_value = port; data->port_len = *ptr - data->port; + data->has_port = data->port_len > 0; TRACE("(%p %p): Found port %s len=%ld value=%lu\n", ptr, data, debugstr_wn(data->port, data->port_len), data->port_len, data->port_value); @@ -1222,6 +1222,9 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data) { data->host = NULL; return FALSE; } + /* Include the ':' in the host for unknown schemes with no port value */ + if(!data->has_port && is_unknown) + data->host_len = *ptr - data->host; } else if(!is_auth_delim(**ptr, !is_unknown)) { /* Found more data which belongs to the host, so this isn't an IPv4. */ *ptr = data->host; @@ -1309,6 +1312,9 @@ static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD extras) { ignore_col = TRUE; } else { data->host_len = tmp - data->host; + /* Include the ':' in the host for unknown schemes with no port value */ + if(!data->has_port && data->scheme_type == URL_SCHEME_UNKNOWN) + data->host_len = *ptr - data->host; break; } } diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 8e58cd4185c..598828ccfd5 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -1901,6 +1901,84 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, + /* Empty port with a known scheme */ + { "http://example.com:/", 0, S_OK, FALSE, 0, + { + {"http://example.com/",S_OK,FALSE}, + {"example.com",S_OK,FALSE}, + {"http://example.com/",S_OK,FALSE}, + {"example.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"example.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://example.com:/",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Empty port with an unknown scheme */ + { "unknown://example.com:/", 0, S_OK, FALSE, 0, + { + {"unknown://example.com:/",S_OK,FALSE}, + {"example.com:",S_OK,FALSE}, + {"unknown://example.com:/",S_OK,FALSE}, + {"example.com:",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"example.com:",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"unknown://example.com:/",S_OK,FALSE}, + {"unknown",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Empty port with an unknown scheme and an IPv4 address */ + { "unknown://127.0.0.1:/", 0, S_OK, FALSE, 0, + { + {"unknown://127.0.0.1:/",S_OK,FALSE}, + {"127.0.0.1:",S_OK,FALSE}, + {"unknown://127.0.0.1:/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"127.0.0.1:",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"unknown://127.0.0.1:/",S_OK,FALSE}, + {"unknown",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_IPV4,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, { "zip://google.com:65536", 0, S_OK, FALSE, 0, { {"zip://google.com:65536/",S_OK,FALSE}, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10542