[PATCH 5/5] kernelbase: Do not initialize output params on failure in UrlGetPart().

Zebediah Figura zfigura at codeweavers.com
Sun Feb 13 12:44:03 CST 2022


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/kernelbase/path.c   | 14 +++++++-------
 dlls/shlwapi/tests/url.c | 13 ++++++++-----
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c
index 7d145e5198e..b753ce3dd2e 100644
--- a/dlls/kernelbase/path.c
+++ b/dlls/kernelbase/path.c
@@ -4321,8 +4321,6 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
     if (!url || !out || !out_len || !*out_len)
         return E_INVALIDARG;
 
-    *out = '\0';
-
     addr = wcschr(url, ':');
     if (!addr)
         scheme = URL_SCHEME_UNKNOWN;
@@ -4337,6 +4335,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
         flags &= ~URL_PARTFLAG_KEEPSCHEME;
         if (!pl.scheme_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4358,18 +4357,19 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
             case URL_SCHEME_SNEWS:
                 break;
             default:
-                *out_len = 0;
                 return E_FAIL;
         }
 
         if (scheme == URL_SCHEME_FILE && (!pl.hostname_len || (pl.hostname_len == 1 && *(pl.hostname + 1) == ':')))
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
 
         if (!pl.hostname_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4380,6 +4380,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
     case URL_PART_USERNAME:
         if (!pl.username_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4390,6 +4391,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
     case URL_PART_PASSWORD:
         if (!pl.password_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4400,6 +4402,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
     case URL_PART_PORT:
         if (!pl.port_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4411,6 +4414,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
         flags &= ~URL_PARTFLAG_KEEPSCHEME;
         if (!pl.query_len)
         {
+            *out = '\0';
             *out_len = 0;
             return S_FALSE;
         }
@@ -4419,17 +4423,13 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
         break;
 
     default:
-        *out_len = 0;
         return E_INVALIDARG;
     }
 
     if (flags == URL_PARTFLAG_KEEPSCHEME && scheme != URL_SCHEME_FILE)
     {
         if (!pl.scheme || !pl.scheme_len)
-        {
-            *out_len = 0;
             return E_FAIL;
-        }
         schaddr = pl.scheme;
         schsize = pl.scheme_len;
         if (*out_len < schsize + size + 2)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index 6a312ecff87..729b069a772 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -845,7 +845,7 @@ static void test_UrlGetPart(void)
                 ok(hr == (tests[i].hr == S_FALSE ? S_OK : tests[i].hr), "Got hr %#x.\n", hr);
         }
 
-        if (hr == S_OK)
+        if (SUCCEEDED(hr))
         {
             ok(!size, "Got size %u.\n", size);
             ok(!buffer[0], "Got result %s.\n", debugstr_a(buffer));
@@ -862,9 +862,9 @@ static void test_UrlGetPart(void)
             }
             else
             {
-                todo_wine ok(size == 1, "Got size %u.\n", size);
+                ok(size == 1, "Got size %u.\n", size);
             }
-            todo_wine ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
+            ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
         }
 
         size = ARRAY_SIZE(bufferW);
@@ -880,8 +880,11 @@ static void test_UrlGetPart(void)
         }
         else
         {
-            todo_wine ok(size == ARRAY_SIZE(bufferW), "Got size %u.\n", size);
-            todo_wine ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
+            todo_wine_if (strchr(url, '"') && part == URL_PART_USERNAME)
+            {
+                ok(size == ARRAY_SIZE(bufferW), "Got size %u.\n", size);
+                ok(!wcscmp(bufferW, L"x"), "Got result %s.\n", debugstr_w(bufferW));
+            }
         }
 
         winetest_pop_context();
-- 
2.34.1




More information about the wine-devel mailing list