Jacek Caban : urlmon: Fixed handling empty URIs.

Alexandre Julliard julliard at winehq.org
Thu Jun 23 04:10:08 CDT 2011


Module: wine
Branch: master
Commit: 6862697acb3ec07ec991b34ed3af96d740563a3d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6862697acb3ec07ec991b34ed3af96d740563a3d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jun 22 19:22:08 2011 +0200

urlmon: Fixed handling empty URIs.

---

 dlls/urlmon/tests/uri.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/urlmon/uri.c       |   44 +++++++++++++++++++-------------------
 2 files changed, 74 insertions(+), 23 deletions(-)

diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index 930622a..bc84825 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -4139,7 +4139,58 @@ static const uri_properties uri_tests[] = {
             {URL_SCHEME_MK,S_OK,FALSE},
             {URLZONE_INVALID,E_NOTIMPL,FALSE}
         }
-    }
+    },
+    {   "", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE,
+        {
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_UNKNOWN,S_OK,FALSE},
+            {0,S_FALSE,FALSE},
+            {URL_SCHEME_UNKNOWN,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
+    },
+    {   " \t ", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE,
+        {
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_UNKNOWN,S_OK,FALSE},
+            {0,S_FALSE,FALSE},
+            {URL_SCHEME_UNKNOWN,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
+    },
+
 };
 
 typedef struct _invalid_uri {
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index f12f826..6f2897a 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -857,35 +857,35 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v
  * characters inside of the URI string.
  */
 static BSTR pre_process_uri(LPCWSTR uri) {
-    BSTR ret;
+    const WCHAR *start, *end, *ptr;
+    WCHAR *ptr2;
     DWORD len;
-    const WCHAR *start, *end;
-    WCHAR *buf, *ptr;
-
-    len = lstrlenW(uri);
+    BSTR ret;
 
     start = uri;
     /* Skip leading controls and whitespace. */
-    while(iscntrlW(*start) || isspaceW(*start)) ++start;
+    while(*start && (iscntrlW(*start) || isspaceW(*start))) ++start;
 
-    end = uri+len-1;
-    if(start == end)
-        /* URI consisted only of control/whitespace. */
-        ret = SysAllocStringLen(NULL, 0);
-    else {
-        while(iscntrlW(*end) || isspaceW(*end)) --end;
+    /* URI consisted only of control/whitespace. */
+    if(!*start)
+        return SysAllocStringLen(NULL, 0);
 
-        buf = heap_alloc(((end+1)-start)*sizeof(WCHAR));
-        if(!buf)
-            return NULL;
+    end = start + strlenW(start);
+    while(--end > start && (iscntrlW(*end) || isspaceW(*end)));
 
-        for(ptr = buf; start < end+1; ++start) {
-            if(!iscntrlW(*start))
-                *ptr++ = *start;
-        }
+    len = ++end - start;
+    for(ptr = start; ptr < end; ptr++) {
+        if(iscntrlW(*ptr))
+            len--;
+    }
+
+    ret = SysAllocStringLen(NULL, len);
+    if(!ret)
+        return NULL;
 
-        ret = SysAllocStringLen(buf, ptr-buf);
-        heap_free(buf);
+    for(ptr = start, ptr2=ret; ptr < end; ptr++) {
+        if(!iscntrlW(*ptr))
+            *ptr2++ = *ptr;
     }
 
     return ret;
@@ -5096,7 +5096,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
     if(!ppURI)
         return E_INVALIDARG;
 
-    if(!pwzURI || !*pwzURI) {
+    if(!pwzURI) {
         *ppURI = NULL;
         return E_INVALIDARG;
     }




More information about the wine-cvs mailing list