Module: wine Branch: master Commit: 142afabb4113e4fb904117230ed4306aa5a2109e URL: http://source.winehq.org/git/wine.git/?a=commit;h=142afabb4113e4fb904117230e...
Author: Alex Henrie alexhenrie24@gmail.com Date: Wed Jan 30 22:31:16 2013 -0700
advapi32: Destination length -1 means no limit.
---
dlls/advapi32/crypt.c | 32 +++++++++++++++++++------------- dlls/advapi32/tests/crypt.c | 11 ++++++++++- 2 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c index 5f44728..3eb4213 100644 --- a/dlls/advapi32/crypt.c +++ b/dlls/advapi32/crypt.c @@ -27,6 +27,7 @@ #include "config.h" #include "wine/port.h"
+#include <limits.h> #include <time.h> #include <stdlib.h> #include <stdio.h> @@ -109,33 +110,38 @@ static inline PWSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user) return keyname; }
-/* CRYPT_UnicodeTOANSI +/* CRYPT_UnicodeToANSI * wstr - unicode string - * str - pointer to ANSI string - * strsize - size of buffer pointed to by str or -1 if we have to do the allocation + * str - pointer to ANSI string or pointer to null pointer if we have to do the allocation + * strsize - size of buffer pointed to by str * * returns TRUE if unsuccessful, FALSE otherwise. * if wstr is NULL, returns TRUE and sets str to NULL! Value of str should be checked after call */ static inline BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR* str, int strsize) { - int count; - if (!wstr) { *str = NULL; return TRUE; } - count = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); - if (strsize == -1) - *str = CRYPT_Alloc(count * sizeof(CHAR)); - else - count = min( count, strsize ); + + if (!*str) + { + strsize = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); + *str = CRYPT_Alloc(strsize * sizeof(CHAR)); + } + else if (strsize < 0) + { + strsize = INT_MAX; /* windows will pretend that the buffer is infinitely long */ + } + if (*str) { - WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, count, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, strsize, NULL, NULL); return TRUE; } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } @@ -481,13 +487,13 @@ BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer, goto error; } pProv->pVTable->dwProvType = dwProvType; - if(!CRYPT_UnicodeToANSI(provname, &provnameA, -1)) + if(!CRYPT_UnicodeToANSI(provname, &provnameA, 0)) { /* CRYPT_UnicodeToANSI calls SetLastError */ goto error; } pProv->pVTable->pszProvName = provnameA; - if(!CRYPT_UnicodeToANSI(pszContainer, &pszContainerA, -1)) + if(!CRYPT_UnicodeToANSI(pszContainer, &pszContainerA, 0)) { /* CRYPT_UnicodeToANSI calls SetLastError */ goto error; diff --git a/dlls/advapi32/tests/crypt.c b/dlls/advapi32/tests/crypt.c index 4820d27..5f4d4e2 100644 --- a/dlls/advapi32/tests/crypt.c +++ b/dlls/advapi32/tests/crypt.c @@ -561,7 +561,16 @@ static void test_enum_providers(void) if (!(provider = LocalAlloc(LMEM_ZEROINIT, providerLen))) return; - providerLen = 0xdeadbeef; + providerLen = -1; + result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen); + ok(result, "expected TRUE, got %d\n", result); + ok(type==dwType, "expected %d, got %d\n", dwType, type); + if (pszProvName) + ok(!strcmp(pszProvName, provider), "expected %s, got %s\n", pszProvName, provider); + ok(cbName==providerLen, "expected %d, got %d\n", cbName, providerLen); + + providerLen = -1000; + provider[0] = 0; result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen); ok(result, "expected TRUE, got %d\n", result); ok(type==dwType, "expected %d, got %d\n", dwType, type);