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