Juan Lang : crypt32: Fix string quoting in CertRDNValueToStrA/ W and CertNameToStrA/W.
Alexandre Julliard
julliard at winehq.org
Wed Feb 2 12:30:14 CST 2011
Module: wine
Branch: master
Commit: 74cf35d2ab55a0972f7e34edc76d69306f78d4a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=74cf35d2ab55a0972f7e34edc76d69306f78d4a7
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Feb 1 10:05:05 2011 -0800
crypt32: Fix string quoting in CertRDNValueToStrA/W and CertNameToStrA/W.
Based on an idea of Christian Inci's.
---
dlls/crypt32/str.c | 139 ++++++++++++++++++++++++++++++++++++++++++++--
dlls/crypt32/tests/str.c | 20 +++---
2 files changed, 143 insertions(+), 16 deletions(-)
diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index 81e9ec3..ae90eb0 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -29,6 +29,133 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
+DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
+ LPSTR psz, DWORD csz)
+{
+ DWORD ret = 0, len;
+
+ TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz);
+
+ switch (dwValueType)
+ {
+ case CERT_RDN_ANY_TYPE:
+ break;
+ case CERT_RDN_NUMERIC_STRING:
+ case CERT_RDN_PRINTABLE_STRING:
+ case CERT_RDN_TELETEX_STRING:
+ case CERT_RDN_VIDEOTEX_STRING:
+ case CERT_RDN_IA5_STRING:
+ case CERT_RDN_GRAPHIC_STRING:
+ case CERT_RDN_VISIBLE_STRING:
+ case CERT_RDN_GENERAL_STRING:
+ len = pValue->cbData;
+ if (!psz || !csz)
+ ret = len;
+ else
+ {
+ DWORD chars = min(len, csz - 1);
+
+ if (chars)
+ {
+ memcpy(psz, pValue->pbData, chars);
+ ret += chars;
+ csz -= chars;
+ }
+ }
+ break;
+ case CERT_RDN_BMP_STRING:
+ case CERT_RDN_UTF8_STRING:
+ len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData,
+ pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL);
+ if (!psz || !csz)
+ ret = len;
+ else
+ {
+ DWORD chars = min(pValue->cbData / sizeof(WCHAR), csz - 1);
+
+ if (chars)
+ {
+ ret = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData,
+ chars, psz, csz - 1, NULL, NULL);
+ csz -= ret;
+ }
+ }
+ break;
+ default:
+ FIXME("string type %d unimplemented\n", dwValueType);
+ }
+ if (psz && csz)
+ {
+ *(psz + ret) = '\0';
+ csz--;
+ ret++;
+ }
+ else
+ ret++;
+ TRACE("returning %d (%s)\n", ret, debugstr_a(psz));
+ return ret;
+}
+
+DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
+ LPWSTR psz, DWORD csz)
+{
+ DWORD ret = 0, len, i, strLen;
+
+ TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz);
+
+ switch (dwValueType)
+ {
+ case CERT_RDN_ANY_TYPE:
+ break;
+ case CERT_RDN_NUMERIC_STRING:
+ case CERT_RDN_PRINTABLE_STRING:
+ case CERT_RDN_TELETEX_STRING:
+ case CERT_RDN_VIDEOTEX_STRING:
+ case CERT_RDN_IA5_STRING:
+ case CERT_RDN_GRAPHIC_STRING:
+ case CERT_RDN_VISIBLE_STRING:
+ case CERT_RDN_GENERAL_STRING:
+ len = pValue->cbData;
+ if (!psz || !csz)
+ ret = len;
+ else
+ {
+ WCHAR *ptr = psz;
+
+ for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++)
+ *ptr = pValue->pbData[i];
+ ret = ptr - psz;
+ }
+ break;
+ case CERT_RDN_BMP_STRING:
+ case CERT_RDN_UTF8_STRING:
+ strLen = len = pValue->cbData / sizeof(WCHAR);
+ if (!psz || !csz)
+ ret = len;
+ else
+ {
+ WCHAR *ptr = psz;
+
+ for (i = 0; i < strLen && ptr - psz < csz; ptr++, i++)
+ *ptr = ((LPCWSTR)pValue->pbData)[i];
+ ret = ptr - psz;
+ }
+ break;
+ default:
+ FIXME("string type %d unimplemented\n", dwValueType);
+ }
+ if (psz && csz)
+ {
+ *(psz + ret) = '\0';
+ csz--;
+ ret++;
+ }
+ else
+ ret++;
+ TRACE("returning %d (%s)\n", ret, debugstr_w(psz));
+ return ret;
+}
+
static inline BOOL is_quotable_char(char c)
{
switch(c)
@@ -48,8 +175,8 @@ static inline BOOL is_quotable_char(char c)
}
}
-DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
- LPSTR psz, DWORD csz)
+static DWORD quote_rdn_value_to_str_a(DWORD dwValueType,
+ PCERT_RDN_VALUE_BLOB pValue, LPSTR psz, DWORD csz)
{
DWORD ret = 0, len, i;
BOOL needsQuotes = FALSE;
@@ -157,8 +284,8 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
return ret;
}
-DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
- LPWSTR psz, DWORD csz)
+static DWORD quote_rdn_value_to_str_w(DWORD dwValueType,
+ PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz)
{
DWORD ret = 0, len, i, strLen;
BOOL needsQuotes = FALSE;
@@ -358,7 +485,7 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName,
psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0);
ret += chars;
}
- chars = CertRDNValueToStrA(
+ chars = quote_rdn_value_to_str_a(
rdn->rgRDNAttr[j].dwValueType,
&rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL,
psz ? csz - ret : 0);
@@ -537,7 +664,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel,
psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0);
ret += chars;
}
- chars = CertRDNValueToStrW(
+ chars = quote_rdn_value_to_str_w(
rdn->rgRDNAttr[j].dwValueType,
&rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL,
psz ? csz - ret : 0);
diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c
index 0285ab8..1846ec6 100644
--- a/dlls/crypt32/tests/str.c
+++ b/dlls/crypt32/tests/str.c
@@ -227,17 +227,17 @@ static void test_CertRDNValueToStrA(void)
{ "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING,
{ sizeof(bin7), bin7 }, "aric at codeweavers.com", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin9), bin9 }, "abc\"def", TRUE },
+ { sizeof(bin9), bin9 }, "abc\"def", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
{ sizeof(bin10), bin10 }, "abc'def", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin11), bin11 }, "abc, def", TRUE },
+ { sizeof(bin11), bin11 }, "abc, def", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin12), bin12 }, " abc ", TRUE },
+ { sizeof(bin12), bin12 }, " abc ", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin13), bin13 }, "\"def\"", TRUE },
+ { sizeof(bin13), bin13 }, "\"def\"", FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin14), bin14 }, "1;3", TRUE },
+ { sizeof(bin14), bin14 }, "1;3", FALSE },
};
DWORD i, ret;
char buffer[2000];
@@ -328,17 +328,17 @@ static void test_CertRDNValueToStrW(void)
{ "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING,
{ sizeof(bin7), bin7 }, aricW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin9), bin9 }, embeddedDoubleQuoteW, TRUE },
+ { sizeof(bin9), bin9 }, embeddedDoubleQuoteW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
{ sizeof(bin10), bin10 }, embeddedSingleQuoteW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin11), bin11 }, embeddedCommaW, TRUE },
+ { sizeof(bin11), bin11 }, embeddedCommaW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin12), bin12 }, trailingAndEndingSpaceW, TRUE },
+ { sizeof(bin12), bin12 }, trailingAndEndingSpaceW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin13), bin13 }, enclosingQuotesW, TRUE },
+ { sizeof(bin13), bin13 }, enclosingQuotesW, FALSE },
{ "0", CERT_RDN_PRINTABLE_STRING,
- { sizeof(bin14), bin14 }, embeddedSemiW, TRUE },
+ { sizeof(bin14), bin14 }, embeddedSemiW, FALSE },
};
DWORD i, ret;
WCHAR buffer[2000];
More information about the wine-cvs
mailing list