Martin Storsjo : combase: Fix cornercase error handling in WindowsCreateStringReference.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 29 09:32:12 CDT 2015


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

Author: Martin Storsjo <martin at martin.st>
Date:   Thu Oct 29 10:21:22 2015 +0200

combase: Fix cornercase error handling in WindowsCreateStringReference.

When WindowsCreateStringReference is given a non-null input string,
the input string must be null terminated at the given length,
even if the input length is zero.

Signed-off-by: Martin Storsjo <martin at martin.st>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/combase/string.c       |  4 ++--
 dlls/combase/tests/string.c | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dlls/combase/string.c b/dlls/combase/string.c
index 49d7695..99cd591 100644
--- a/dlls/combase/string.c
+++ b/dlls/combase/string.c
@@ -105,6 +105,8 @@ HRESULT WINAPI WindowsCreateStringReference(LPCWSTR ptr, UINT32 len,
 
     if (out == NULL || header == NULL)
         return E_INVALIDARG;
+    if (ptr != NULL && ptr[len] != '\0')
+        return E_INVALIDARG;
     if (len == 0)
     {
         *out = NULL;
@@ -112,8 +114,6 @@ HRESULT WINAPI WindowsCreateStringReference(LPCWSTR ptr, UINT32 len,
     }
     if (ptr == NULL)
         return E_POINTER;
-    if (ptr[len] != '\0')
-        return E_INVALIDARG;
     priv->buffer = (LPWSTR)ptr;
     priv->length = len;
     priv->reference = TRUE;
diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c
index 5a59b50..7af5f7e 100644
--- a/dlls/combase/tests/string.c
+++ b/dlls/combase/tests/string.c
@@ -124,6 +124,9 @@ static void test_create_delete(void)
      * length. According to MSDN this should be E_INVALIDARG, but it returns
      * 0x80000017 in practice. */
     ok(FAILED(pWindowsCreateStringReference(input_string, 5, &header, &str)), "Incorrect error handling\n");
+    /* If the input string is non-null, it must be null-terminated even if the
+     * length is zero. */
+    ok(FAILED(pWindowsCreateStringReference(input_string, 0, &header, &str)), "Incorrect error handling\n");
     ok(pWindowsCreateStringReference(input_string, 6, NULL, &str) == E_INVALIDARG, "Incorrect error handling\n");
     ok(pWindowsCreateStringReference(input_string, 6, &header, NULL) == E_INVALIDARG, "Incorrect error handling\n");
     ok(pWindowsCreateStringReference(NULL, 6, &header, &str) == E_POINTER, "Incorrect error handling\n");
@@ -138,9 +141,21 @@ static void test_create_delete(void)
     ok(str == NULL, "Empty string not a null string\n");
     ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
 
+    ok(pWindowsCreateString(input_string, 0, &str) == S_OK, "Failed to create string\n");
+    ok(str == NULL, "Empty string not a null string\n");
+    ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
+
     ok(pWindowsCreateStringReference(input_empty_string, 0, &header, &str) == S_OK, "Failed to create string\n");
     ok(str == NULL, "Empty string not a null string\n");
     ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
+
+    ok(pWindowsCreateString(NULL, 0, &str) == S_OK, "Failed to create string\n");
+    ok(str == NULL, "Empty string not a null string\n");
+    ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
+
+    ok(pWindowsCreateStringReference(NULL, 0, &header, &str) == S_OK, "Failed to create string\n");
+    ok(str == NULL, "Empty string not a null string\n");
+    ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n");
 }
 
 static void test_duplicate(void)




More information about the wine-cvs mailing list