Module: wine Branch: master Commit: 7cf611ef3bae6340e6c7fce10e45ef9843f117fd URL: http://source.winehq.org/git/wine.git/?a=commit;h=7cf611ef3bae6340e6c7fce10e...
Author: Juan Lang juan.lang@gmail.com Date: Sat Oct 20 14:22:04 2007 -0700
crypt32: Fail if MultiByteToWideChar converts 0 characters.
---
dlls/crypt32/str.c | 38 ++++++++++++++++++++++++++------------ 1 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c index 96430dc..9677897 100644 --- a/dlls/crypt32/str.c +++ b/dlls/crypt32/str.c @@ -455,7 +455,6 @@ BOOL WINAPI CertStrToNameA(DWORD dwCertEncodingType, LPCSTR pszX500, DWORD dwStrType, void *pvReserved, BYTE *pbEncoded, DWORD *pcbEncoded, LPCSTR *ppszError) { - LPWSTR x500, errorStr; BOOL ret; int len;
@@ -464,24 +463,39 @@ BOOL WINAPI CertStrToNameA(DWORD dwCertEncodingType, LPCSTR pszX500, ppszError);
len = MultiByteToWideChar(CP_ACP, 0, pszX500, -1, NULL, 0); - x500 = CryptMemAlloc(len * sizeof(WCHAR)); - if (x500) + if (len) { - MultiByteToWideChar(CP_ACP, 0, pszX500, -1, x500, len); - ret = CertStrToNameW(dwCertEncodingType, x500, dwStrType, pvReserved, - pbEncoded, pcbEncoded, ppszError ? (LPCWSTR *)&errorStr : NULL); - if (ppszError) + LPWSTR x500, errorStr; + + if ((x500 = CryptMemAlloc(len * sizeof(WCHAR)))) { - DWORD i; + MultiByteToWideChar(CP_ACP, 0, pszX500, -1, x500, len); + ret = CertStrToNameW(dwCertEncodingType, x500, dwStrType, + pvReserved, pbEncoded, pcbEncoded, + ppszError ? (LPCWSTR *)&errorStr : NULL); + if (ppszError) + { + DWORD i;
- *ppszError = pszX500; - for (i = 0; i < errorStr - x500; i++) - *ppszError = CharNextA(*ppszError); + *ppszError = pszX500; + for (i = 0; i < errorStr - x500; i++) + *ppszError = CharNextA(*ppszError); + } + CryptMemFree(x500); + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; } - CryptMemFree(x500); } else + { + SetLastError(CRYPT_E_INVALID_X500_STRING); + if (ppszError) + *ppszError = pszX500; ret = FALSE; + } return ret; }