crypt32: Fix filling short output in CertGetNameStringA().

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2022-04-14 14:09:01 +03:00 committed by Alexandre Julliard
parent 66d9250c42
commit bc96cfac11
2 changed files with 33 additions and 37 deletions

View File

@ -1110,46 +1110,38 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500,
return ret;
}
DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD dwFlags, void *pvTypePara, LPSTR pszNameString, DWORD cchNameString)
DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT cert, DWORD type,
DWORD flags, void *type_para, LPSTR name, DWORD name_len)
{
DWORD ret;
DWORD len, len_mb, ret;
LPWSTR nameW;
TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", pCertContext, dwType, dwFlags,
pvTypePara, pszNameString, cchNameString);
TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", cert, type, flags, type_para, name, name_len);
if (pszNameString)
len = CertGetNameStringW(cert, type, flags, type_para, NULL, 0);
if (!(nameW = CryptMemAlloc(len * sizeof(*nameW))))
{
LPWSTR wideName;
DWORD nameLen;
nameLen = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
NULL, 0);
wideName = CryptMemAlloc(nameLen * sizeof(WCHAR));
if (wideName)
{
CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
wideName, nameLen);
nameLen = WideCharToMultiByte(CP_ACP, 0, wideName, nameLen,
pszNameString, cchNameString, NULL, NULL);
if (nameLen <= cchNameString)
ret = nameLen;
else
{
pszNameString[cchNameString - 1] = '\0';
ret = cchNameString;
}
CryptMemFree(wideName);
}
else
{
*pszNameString = '\0';
ret = 1;
}
ERR("No memory.\n");
if (name && name_len) *name = 0;
return 1;
}
else
ret = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
NULL, 0);
len = CertGetNameStringW(cert, type, flags, type_para, nameW, len);
len_mb = WideCharToMultiByte(CP_ACP, 0, nameW, len, NULL, 0, NULL, NULL);
if (!name || !name_len)
{
CryptMemFree(nameW);
return len_mb;
}
ret = WideCharToMultiByte(CP_ACP, 0, nameW, len, name, name_len, NULL, NULL);
if (ret < len_mb)
{
name[0] = 0;
ret = 1;
}
CryptMemFree(nameW);
return ret;
}

View File

@ -766,9 +766,13 @@ static void test_CertGetNameString_value_(unsigned int line, PCCERT_CONTEXT cont
ok(!strcmp(str, expected), "line %u: unexpected value %s.\n", line, str);
str[0] = str[1] = 0xcc;
retlen = CertGetNameStringA(context, type, 0, type_para, str, len - 1);
todo_wine ok(retlen == 1, "line %u: Unexpected len %lu, expected 1.\n", line, retlen);
todo_wine ok(!str[0], "line %u: unexpected str[0] %#x.\n", line, str[0]);
ok(retlen == 1, "line %u: Unexpected len %lu, expected 1.\n", line, retlen);
ok(!str[0], "line %u: unexpected str[0] %#x.\n", line, str[0]);
ok(str[1] == expected[1], "line %u: unexpected str[1] %#x.\n", line, str[1]);
retlen = CertGetNameStringA(context, type, 0, type_para, str, 0);
ok(retlen == len, "line %u: Unexpected len %lu, expected 1.\n", line, retlen);
retlen = CertGetNameStringW(context, type, 0, type_para, strW, len);
ok(retlen == len, "line %u: unexpected len %lu, expected 1.\n", line, retlen);
ok(!wcscmp(strW, expectedW), "line %u: unexpected value %s.\n", line, debugstr_w(strW));