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