Skip to content

Commit 1a17364

Browse files
committed
[CRYPT32] Sync CertGetNameStringA with wine-10.0
Fixes buffer underrun in crypt32_winetest str
1 parent bd9a83b commit 1a17364

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

dll/win32/crypt32/str.c

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,46 +1124,38 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500,
11241124
return ret;
11251125
}
11261126

1127-
DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
1128-
DWORD dwFlags, void *pvTypePara, LPSTR pszNameString, DWORD cchNameString)
1127+
DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT cert, DWORD type,
1128+
DWORD flags, void *type_para, LPSTR name, DWORD name_len)
11291129
{
1130-
DWORD ret;
1130+
DWORD len, len_mb, ret;
1131+
LPWSTR nameW;
11311132

1132-
TRACE("(%p, %d, %08x, %p, %p, %d)\n", pCertContext, dwType, dwFlags,
1133-
pvTypePara, pszNameString, cchNameString);
1133+
TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", cert, type, flags, type_para, name, name_len);
11341134

1135-
if (pszNameString)
1135+
len = CertGetNameStringW(cert, type, flags, type_para, NULL, 0);
1136+
1137+
if (!(nameW = CryptMemAlloc(len * sizeof(*nameW))))
11361138
{
1137-
LPWSTR wideName;
1138-
DWORD nameLen;
1139+
ERR("No memory.\n");
1140+
if (name && name_len) *name = 0;
1141+
return 1;
1142+
}
11391143

1140-
nameLen = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
1141-
NULL, 0);
1142-
wideName = CryptMemAlloc(nameLen * sizeof(WCHAR));
1143-
if (wideName)
1144-
{
1145-
CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
1146-
wideName, nameLen);
1147-
nameLen = WideCharToMultiByte(CP_ACP, 0, wideName, nameLen,
1148-
pszNameString, cchNameString, NULL, NULL);
1149-
if (nameLen <= cchNameString)
1150-
ret = nameLen;
1151-
else
1152-
{
1153-
pszNameString[cchNameString - 1] = '\0';
1154-
ret = cchNameString;
1155-
}
1156-
CryptMemFree(wideName);
1157-
}
1158-
else
1159-
{
1160-
*pszNameString = '\0';
1161-
ret = 1;
1162-
}
1144+
len = CertGetNameStringW(cert, type, flags, type_para, nameW, len);
1145+
len_mb = WideCharToMultiByte(CP_ACP, 0, nameW, len, NULL, 0, NULL, NULL);
1146+
if (!name || !name_len)
1147+
{
1148+
CryptMemFree(nameW);
1149+
return len_mb;
11631150
}
1164-
else
1165-
ret = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
1166-
NULL, 0);
1151+
1152+
ret = WideCharToMultiByte(CP_ACP, 0, nameW, len, name, name_len, NULL, NULL);
1153+
if (ret < len_mb)
1154+
{
1155+
name[0] = 0;
1156+
ret = 1;
1157+
}
1158+
CryptMemFree(nameW);
11671159
return ret;
11681160
}
11691161

0 commit comments

Comments
 (0)