Juan Lang : crypt32: Use a helper function to simplify CertGetNameStringW.

Alexandre Julliard julliard at winehq.org
Wed Sep 9 09:57:50 CDT 2009


Module: wine
Branch: master
Commit: 4d2972c844071e4e35a537dcfb800db14c820993
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4d2972c844071e4e35a537dcfb800db14c820993

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Sep  8 21:55:47 2009 -0700

crypt32: Use a helper function to simplify CertGetNameStringW.

---

 dlls/crypt32/str.c |   82 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index b300b1f..ab8b947 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -930,6 +930,42 @@ DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
     return ret;
 }
 
+/* Searches cert's extensions for the alternate name extension with OID
+ * altNameOID, and if found, searches it for the alternate name type entryType.
+ * If found, returns a pointer to the entry, otherwise returns NULL.
+ * Regardless of whether an entry of the desired type is found, if the
+ * alternate name extension is present, sets *info to the decoded alternate
+ * name extension, which you must free using LocalFree.
+ * The return value is a pointer within *info, so don't free *info before
+ * you're done with the return value.
+ */
+static PCERT_ALT_NAME_ENTRY cert_find_alt_name_entry(PCCERT_CONTEXT cert,
+ LPCSTR altNameOID, DWORD entryType, PCERT_ALT_NAME_INFO *info)
+{
+    PCERT_ALT_NAME_ENTRY entry = NULL;
+    PCERT_EXTENSION ext = CertFindExtension(altNameOID,
+     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension);
+
+    if (ext)
+    {
+        DWORD bytes = 0;
+
+        if (CryptDecodeObjectEx(cert->dwCertEncodingType, X509_ALTERNATE_NAME,
+         ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
+         info, &bytes))
+        {
+            DWORD i;
+
+            for (i = 0; !entry && i < (*info)->cAltEntry; i++)
+                if ((*info)->rgAltEntry[i].dwAltNameChoice == entryType)
+                    entry = &(*info)->rgAltEntry[i];
+        }
+    }
+    else
+        *info = NULL;
+    return entry;
+}
+
 DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
  DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
 {
@@ -975,42 +1011,28 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
              pszNameString, cchNameString);
         else
         {
-            PCERT_EXTENSION ext = CertFindExtension(altNameOID,
-             pCertContext->pCertInfo->cExtension,
-             pCertContext->pCertInfo->rgExtension);
+            CERT_ALT_NAME_INFO *altInfo;
+            PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext,
+             altNameOID, CERT_ALT_NAME_RFC822_NAME, &altInfo);
 
-            if (ext)
+            if (altInfo)
             {
-                PCERT_ALT_NAME_INFO altInfo;
-
-                bytes = 0;
-                if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType,
-                 X509_ALTERNATE_NAME, ext->Value.pbData, ext->Value.cbData,
-                 CRYPT_DECODE_ALLOC_FLAG, NULL, &altInfo, &bytes))
+                if (!entry && altInfo->cAltEntry)
+                    entry = &altInfo->rgAltEntry[0];
+                if (entry)
                 {
-                    PCERT_ALT_NAME_ENTRY entry = NULL;
-
-                    for (i = 0; !entry && i < altInfo->cAltEntry; i++)
-                        if (altInfo->rgAltEntry[i].dwAltNameChoice ==
-                         CERT_ALT_NAME_RFC822_NAME)
-                            entry = &altInfo->rgAltEntry[i];
-                    if (!entry && altInfo->cAltEntry)
-                        entry = &altInfo->rgAltEntry[0];
-                    if (entry)
+                    if (!pszNameString)
+                        ret = strlenW(entry->pwszRfc822Name) + 1;
+                    else
                     {
-                        if (!pszNameString)
-                            ret = strlenW(entry->pwszRfc822Name) + 1;
-                        else
-                        {
-                            ret = min(strlenW(entry->pwszRfc822Name),
-                             cchNameString - 1);
-                            memcpy(pszNameString, entry->pwszRfc822Name,
-                             ret * sizeof(WCHAR));
-                            pszNameString[ret++] = 0;
-                        }
+                        ret = min(strlenW(entry->pwszRfc822Name),
+                         cchNameString - 1);
+                        memcpy(pszNameString, entry->pwszRfc822Name,
+                         ret * sizeof(WCHAR));
+                        pszNameString[ret++] = 0;
                     }
-                    LocalFree(altInfo);
                 }
+                LocalFree(altInfo);
             }
         }
         if (nameInfo)




More information about the wine-cvs mailing list