Thomas Mullaly : urlmon: Implemented validation of scheme component of a IUriBuilder.
Alexandre Julliard
julliard at winehq.org
Mon Sep 20 12:12:19 CDT 2010
Module: wine
Branch: master
Commit: f2a1737e35e7fd46c5a960360bb475d71b1989f2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2a1737e35e7fd46c5a960360bb475d71b1989f2
Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date: Sat Sep 18 15:19:55 2010 -0400
urlmon: Implemented validation of scheme component of a IUriBuilder.
---
dlls/urlmon/tests/uri.c | 19 +++++++++++++
dlls/urlmon/uri.c | 69 ++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 82 insertions(+), 6 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index 9ef36aa..6830832 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -5085,6 +5085,25 @@ static const uri_builder_test uri_builder_tests[] = {
{URL_SCHEME_HTTP,S_OK},
{URLZONE_INVALID,E_NOTIMPL}
}
+ },
+ { NULL,0,S_OK,FALSE,
+ {
+ {TRUE,"/test/test/",NULL,Uri_PROPERTY_PATH,S_OK,FALSE},
+ {TRUE,"#Fr<|>g",NULL,Uri_PROPERTY_FRAGMENT,S_OK,FALSE}
+ },
+ {FALSE},
+ 0,INET_E_INVALID_URL,FALSE,
+ 0,INET_E_INVALID_URL,FALSE,
+ 0,0,0,INET_E_INVALID_URL,FALSE
+ },
+ { "http://google.com/",0,S_OK,FALSE,
+ {
+ {TRUE,"ht%xxtp",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,FALSE}
+ },
+ {FALSE},
+ 0,INET_E_INVALID_URL,FALSE,
+ 0,INET_E_INVALID_URL,FALSE,
+ 0,0,0,INET_E_INVALID_URL,FALSE
}
};
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index e4a7401..bab021b 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -26,6 +26,8 @@
#define UINT_MAX 0xffffffff
#define USHORT_MAX 0xffff
+#define ALLOW_NULL_TERM_SCHEME 0x1
+
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x66}};
@@ -1148,7 +1150,7 @@ static BOOL check_ipv4address(const WCHAR **ptr, BOOL strict) {
* scheme = ALPHA *(ALPHA | NUM | '+' | '-' | '.') as defined by RFC 3896.
* NOTE: Windows accepts a number as the first character of a scheme.
*/
-static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data) {
+static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data, DWORD extras) {
const WCHAR *start = *ptr;
data->scheme = NULL;
@@ -1172,7 +1174,7 @@ static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data) {
return FALSE;
/* Schemes must end with a ':' */
- if(**ptr != ':') {
+ if(**ptr != ':' && !((extras & ALLOW_NULL_TERM_SCHEME) && !**ptr)) {
*ptr = start;
return FALSE;
}
@@ -1225,7 +1227,7 @@ static BOOL parse_scheme_type(parse_data *data) {
*
* Returns TRUE if it was able to successfully parse the information.
*/
-static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) {
+static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) {
static const WCHAR fileW[] = {'f','i','l','e',0};
static const WCHAR wildcardW[] = {'*',0};
@@ -1245,7 +1247,7 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) {
ptr, data, flags);
return FALSE;
}
- } else if(!parse_scheme_name(ptr, data)) {
+ } else if(!parse_scheme_name(ptr, data, extras)) {
/* No Scheme was found, this means it could be:
* a) an implicit Wildcard scheme
* b) a relative URI
@@ -2091,7 +2093,7 @@ static BOOL parse_uri(parse_data *data, DWORD flags) {
TRACE("(%p %x): BEGINNING TO PARSE URI %s.\n", data, flags, debugstr_w(data->uri));
- if(!parse_scheme(pptr, data, flags))
+ if(!parse_scheme(pptr, data, flags, 0))
return FALSE;
if(!parse_hierpart(pptr, data, flags))
@@ -3407,9 +3409,58 @@ static void reset_builder(UriBuilder *builder) {
builder->modified_props = 0;
}
+static HRESULT validate_scheme_name(const UriBuilder *builder, parse_data *data, DWORD flags) {
+ const WCHAR *ptr;
+ const WCHAR **pptr;
+ DWORD expected_len;
+
+ if(builder->scheme) {
+ ptr = builder->scheme;
+ expected_len = builder->scheme_len;
+ } else if(builder->uri && builder->uri->scheme_start > -1) {
+ ptr = builder->uri->canon_uri+builder->uri->scheme_start;
+ expected_len = builder->uri->scheme_len;
+ } else {
+ static const WCHAR nullW[] = {0};
+ ptr = nullW;
+ expected_len = 0;
+ }
+
+ pptr = &ptr;
+ if(parse_scheme(pptr, data, flags, ALLOW_NULL_TERM_SCHEME) &&
+ data->scheme_len == expected_len) {
+ if(data->scheme)
+ TRACE("(%p %p %x): Found valid scheme component %s.\n", builder, data, flags,
+ debugstr_wn(data->scheme, data->scheme_len));
+ } else {
+ TRACE("(%p %p %x): Invalid scheme component found %s.\n", builder, data, flags,
+ debugstr_wn(ptr, expected_len));
+ return INET_E_INVALID_URL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT validate_components(const UriBuilder *builder, parse_data *data, DWORD flags) {
+ HRESULT hr;
+
+ memset(data, 0, sizeof(parse_data));
+
+ TRACE("(%p %p %x): Beginning to validate builder components.\n", builder, data, flags);
+
+ hr = validate_scheme_name(builder, data, flags);
+ if(FAILED(hr))
+ return hr;
+
+ return E_NOTIMPL;
+}
+
static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_flags,
DWORD use_orig_flags, DWORD encoding_mask)
{
+ HRESULT hr;
+ parse_data data;
+
if(!uri)
return E_POINTER;
@@ -3438,7 +3489,13 @@ static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_fla
return S_OK;
}
- return E_NOTIMPL;
+ hr = validate_components(builder, &data, create_flags);
+ if(FAILED(hr)) {
+ *uri = NULL;
+ return hr;
+ }
+
+ return S_OK;
}
#define URI_THIS(iface) DEFINE_THIS(Uri, IUri, iface)
More information about the wine-cvs
mailing list