[PATCH 5/7] crypt32: Fix filling short output in CertGetNameStringA().
Paul Gofman
wine at gitlab.winehq.org
Thu Apr 28 18:51:39 CDT 2022
From: Paul Gofman <pgofman at codeweavers.com>
---
dlls/crypt32/str.c | 60 +++++++++++++++++-----------------------
dlls/crypt32/tests/str.c | 8 ++++--
2 files changed, 32 insertions(+), 36 deletions(-)
diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index ad0c71d697f..5ddad1ff4e6 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -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;
+ ERR("No memory.\n");
+ if (name && name_len) *name = 0;
+ return 1;
+ }
- 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;
- }
+ 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;
}
- else
- ret = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
- NULL, 0);
+
+ 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;
}
diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c
index 3009fb72c03..1cfdf8ee7b7 100644
--- a/dlls/crypt32/tests/str.c
+++ b/dlls/crypt32/tests/str.c
@@ -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));
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/12
More information about the wine-devel
mailing list