From bcc603758ca830d864c7ad29adfe3366a973aa97 Mon Sep 17 00:00:00 2001 From: Louis Lenders Date: Sat, 29 Aug 2009 13:14:16 +0200 Subject: shlwapi: Test some cornercases for StrCpyN{A,W} + make them pass in wine --- dlls/shlwapi/string.c | 10 +++++++--- dlls/shlwapi/tests/string.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c index 755360d..09e5968 100644 --- a/dlls/shlwapi/string.c +++ b/dlls/shlwapi/string.c @@ -499,12 +499,16 @@ LPWSTR WINAPI StrCpyNW(LPWSTR lpszStr, LPCWSTR lpszSrc, int iLen) { TRACE("(%p,%s,%i)\n", lpszStr, debugstr_w(lpszSrc), iLen); - lstrcpynW(lpszStr, lpszSrc, iLen); + if(iLen) + { + if(lpszSrc) + lstrcpynW(lpszStr, lpszSrc, iLen); + else + *lpszStr = '\0'; + } return lpszStr; } - - /************************************************************************* * SHLWAPI_StrStrHelperA * diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c index fa50626..fc649aa 100644 --- a/dlls/shlwapi/tests/string.c +++ b/dlls/shlwapi/tests/string.c @@ -818,6 +818,21 @@ static void test_StrXXX_overflows(void) wstr1[2*MAX_PATH] = 0; memset(buf, 0xbf, sizeof(buf)); + expect_eq(StrCpyNA(buf, str1, 0), buf, PCHAR, "%p"); + expect_eq(buf[0], '\xbf', CHAR, "%x"); + expect_eq(buf[1], '\xbf', CHAR, "%x"); + + memset(buf, 0xbf, sizeof(buf)); + expect_eq(StrCpyNA(buf, 0, 10), 0, PCHAR, "%p"); + expect_eq(buf[0], '\xbf', CHAR, "%x"); + expect_eq(buf[1], '\xbf', CHAR, "%x"); + + memset(buf, 0xbf, sizeof(buf)); + expect_eq(StrCpyNA(buf, 0, 0), buf, PCHAR, "%p"); + expect_eq(buf[0], '\xbf', CHAR, "%x"); + expect_eq(buf[1], '\xbf', CHAR, "%x"); + + memset(buf, 0xbf, sizeof(buf)); expect_eq(StrCpyNA(buf, str1, 10), buf, PCHAR, "%p"); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], '\xbf', CHAR, "%x"); @@ -832,6 +847,21 @@ static void test_StrXXX_overflows(void) win_skip("StrCatBuffA() is not available\n"); memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 10), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], 0, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, wstr1, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, wstr1, 10), wbuf, PWCHAR, "%p"); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); -- 1.6.0.4