Module: wine Branch: master Commit: 6e841fdb75807c159b1f9775be42d0ea11dd8216 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6e841fdb75807c159b1f9775be...
Author: Alex Henrie alexhenrie24@gmail.com Date: Wed Dec 23 21:56:59 2015 -0700
kernel32: Set error if dstlen < 0 in codepage conversion functions.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/locale.c | 4 ++-- dlls/kernel32/tests/codepage.c | 48 +++++++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index 8ecbb0c..d7619db 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -2152,7 +2152,7 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen, const union cptable *table; int ret;
- if (!src || !srclen || (!dst && dstlen)) + if (!src || !srclen || (!dst && dstlen) || dstlen < 0) { SetLastError( ERROR_INVALID_PARAMETER ); return 0; @@ -2368,7 +2368,7 @@ INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen, const union cptable *table; int ret, used_tmp;
- if (!src || !srclen || (!dst && dstlen)) + if (!src || !srclen || (!dst && dstlen) || dstlen < 0) { SetLastError( ERROR_INVALID_PARAMETER ); return 0; diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index 54f62ae..6718a3b 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -28,6 +28,7 @@ #include "winbase.h" #include "winnls.h"
+static const char foobarA[] = "foobar"; static const WCHAR foobarW[] = {'f','o','o','b','a','r',0};
static void test_destination_buffer(void) @@ -144,48 +145,57 @@ static void test_negative_source_length(void) static void test_negative_dest_length(void) { int len, i; - static char buf[LONGBUFLEN]; + static WCHAR bufW[LONGBUFLEN]; + static char bufA[LONGBUFLEN]; static WCHAR originalW[LONGBUFLEN]; static char originalA[LONGBUFLEN]; DWORD theError;
/* Test return on -1 dest length */ SetLastError( 0xdeadbeef ); - memset(buf,'x',sizeof(buf)); - len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, -1, NULL, NULL); - todo_wine { - ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, - "WideCharToMultiByte(destlen -1): len=%d error=%x\n", len, GetLastError()); - } + memset(bufA,'x',sizeof(bufA)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, bufA, -1, NULL, NULL); + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "WideCharToMultiByte(destlen -1): len=%d error=%x\n", len, GetLastError()); + + SetLastError( 0xdeadbeef ); + memset(bufW,'x',sizeof(bufW)); + len = MultiByteToWideChar(CP_ACP, 0, foobarA, -1, bufW, -1); + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "MultiByteToWideChar(destlen -1): len=%d error=%x\n", len, GetLastError());
/* Test return on -1000 dest length */ SetLastError( 0xdeadbeef ); - memset(buf,'x',sizeof(buf)); - len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, -1000, NULL, NULL); - todo_wine { - ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, - "WideCharToMultiByte(destlen -1000): len=%d error=%x\n", len, GetLastError()); - } + memset(bufA,'x',sizeof(bufA)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, bufA, -1000, NULL, NULL); + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "WideCharToMultiByte(destlen -1000): len=%d error=%x\n", len, GetLastError()); + + SetLastError( 0xdeadbeef ); + memset(bufW,'x',sizeof(bufW)); + len = MultiByteToWideChar(CP_ACP, 0, foobarA, -1000, bufW, -1); + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "MultiByteToWideChar(destlen -1000): len=%d error=%x\n", len, GetLastError());
/* Test return on INT_MAX dest length */ SetLastError( 0xdeadbeef ); - memset(buf,'x',sizeof(buf)); - len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, INT_MAX, NULL, NULL); - ok(len == 7 && !lstrcmpA(buf, "foobar") && GetLastError() == 0xdeadbeef, + memset(bufA,'x',sizeof(bufA)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, bufA, INT_MAX, NULL, NULL); + ok(len == 7 && !lstrcmpA(bufA, "foobar") && GetLastError() == 0xdeadbeef, "WideCharToMultiByte(destlen INT_MAX): len=%d error=%x\n", len, GetLastError());
/* Test return on INT_MAX dest length and very long input */ SetLastError( 0xdeadbeef ); - memset(buf,'x',sizeof(buf)); + memset(bufA,'x',sizeof(bufA)); for (i=0; i < LONGBUFLEN - 1; i++) { originalW[i] = 'Q'; originalA[i] = 'Q'; } originalW[LONGBUFLEN-1] = 0; originalA[LONGBUFLEN-1] = 0; - len = WideCharToMultiByte(CP_ACP, 0, originalW, -1, buf, INT_MAX, NULL, NULL); + len = WideCharToMultiByte(CP_ACP, 0, originalW, -1, bufA, INT_MAX, NULL, NULL); theError = GetLastError(); - ok(len == LONGBUFLEN && !lstrcmpA(buf, originalA) && theError == 0xdeadbeef, + ok(len == LONGBUFLEN && !lstrcmpA(bufA, originalA) && theError == 0xdeadbeef, "WideCharToMultiByte(srclen %d, destlen INT_MAX): len %d error=%x\n", LONGBUFLEN, len, theError);
}