Jacek Caban : crypt32: Added cloning logic to context's vtbl.

Alexandre Julliard julliard at winehq.org
Tue Oct 15 13:27:13 CDT 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct 15 16:53:54 2013 +0200

crypt32: Added cloning logic to context's vtbl.

---

 dlls/crypt32/cert.c            |   15 ++++++++++++-
 dlls/crypt32/collectionstore.c |    8 +------
 dlls/crypt32/context.c         |    4 +-
 dlls/crypt32/crl.c             |   15 ++++++++++++-
 dlls/crypt32/crypt32_private.h |    9 ++++---
 dlls/crypt32/ctl.c             |   15 ++++++++++++-
 dlls/crypt32/store.c           |   46 ++++++++++++++++++---------------------
 7 files changed, 71 insertions(+), 41 deletions(-)

diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 2c96419..60cff2d 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -117,8 +117,21 @@ static void Cert_free(context_t *context)
     LocalFree(cert->ctx.pCertInfo);
 }
 
+static context_t *Cert_clone(context_t *context, WINECRYPT_CERTSTORE *store)
+{
+    cert_t *cert;
+
+    cert = (cert_t*)Context_CreateLinkContext(sizeof(CERT_CONTEXT), context);
+    if(!cert)
+        return NULL;
+
+    cert->ctx.hCertStore = store;
+    return &cert->base;
+}
+
 static const context_vtbl_t cert_vtbl = {
-    Cert_free
+    Cert_free,
+    Cert_clone
 };
 
 BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
diff --git a/dlls/crypt32/collectionstore.c b/dlls/crypt32/collectionstore.c
index 9fa1f05..855365a 100644
--- a/dlls/crypt32/collectionstore.c
+++ b/dlls/crypt32/collectionstore.c
@@ -76,7 +76,7 @@ static void *CRYPT_CollectionCreateContextFromChild(WINE_COLLECTIONSTORE *store,
 {
     context_t *ret;
 
-    ret = Context_CreateLinkContext(contextSize, child);
+    ret = child->vtbl->clone(child, &store->hdr);
     if (!ret)
         return NULL;
 
@@ -210,8 +210,6 @@ static BOOL Collection_addCert(WINECRYPT_CERTSTORE *store, void *cert,
         PCERT_CONTEXT context =
          CRYPT_CollectionCreateContextFromChild(cs, storeEntry, context_from_ptr(childContext), sizeof(CERT_CONTEXT));
 
-        if (context)
-            context->hCertStore = store;
         *ppStoreContext = context;
     }
     CertFreeCertificateContext(childContext);
@@ -287,8 +285,6 @@ static BOOL Collection_addCRL(WINECRYPT_CERTSTORE *store, void *crl,
         PCRL_CONTEXT context =
          CRYPT_CollectionCreateContextFromChild(cs, storeEntry, context_from_ptr(childContext), sizeof(CRL_CONTEXT));
 
-        if (context)
-            context->hCertStore = store;
         *ppStoreContext = context;
     }
     CertFreeCRLContext(childContext);
@@ -363,8 +359,6 @@ static BOOL Collection_addCTL(WINECRYPT_CERTSTORE *store, void *ctl,
         PCTL_CONTEXT context =
          CRYPT_CollectionCreateContextFromChild(cs, storeEntry, context_from_ptr(childContext), sizeof(CTL_CONTEXT));
 
-        if (context)
-            context->hCertStore = store;
         *ppStoreContext = context;
     }
     CertFreeCTLContext(childContext);
diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c
index 05e5d79..bb919f2 100644
--- a/dlls/crypt32/context.c
+++ b/dlls/crypt32/context.c
@@ -162,13 +162,13 @@ struct ContextList *ContextList_Create(
     return list;
 }
 
-void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace)
+void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace, struct WINE_CRYPTCERTSTORE *store)
 {
     context_t *context;
 
     TRACE("(%p, %p, %p)\n", list, toLink, toReplace);
 
-    context = Context_CreateLinkContext(list->contextSize, context_from_ptr(toLink));
+    context = context_from_ptr(toLink)->vtbl->clone(BASE_CONTEXT_FROM_CONTEXT(toLink), store);
     if (context)
     {
         TRACE("adding %p\n", context);
diff --git a/dlls/crypt32/crl.c b/dlls/crypt32/crl.c
index 2e3a58f..75fdc8e 100644
--- a/dlls/crypt32/crl.c
+++ b/dlls/crypt32/crl.c
@@ -37,8 +37,21 @@ static void CRL_free(context_t *context)
     LocalFree(crl->ctx.pCrlInfo);
 }
 
+static context_t *CRL_clone(context_t *context, WINECRYPT_CERTSTORE *store)
+{
+    crl_t *crl;
+
+    crl = (crl_t*)Context_CreateLinkContext(sizeof(CRL_CONTEXT), context);
+    if(!crl)
+        return NULL;
+
+    crl->ctx.hCertStore = store;
+    return &crl->base;
+}
+
 static const context_vtbl_t crl_vtbl = {
-    CRL_free
+    CRL_free,
+    CRL_clone
 };
 
 PCCRL_CONTEXT WINAPI CertCreateCRLContext(DWORD dwCertEncodingType,
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index fc1e122..9382841 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -159,12 +159,16 @@ void crypt_sip_free(void) DECLSPEC_HIDDEN;
 void root_store_free(void) DECLSPEC_HIDDEN;
 void default_chain_engine_free(void) DECLSPEC_HIDDEN;
 
+/* (Internal) certificate store types and functions */
+struct WINE_CRYPTCERTSTORE;
+
 typedef struct _CONTEXT_PROPERTY_LIST CONTEXT_PROPERTY_LIST;
 
 typedef struct _context_t context_t;
 
 typedef struct {
     void (*free)(context_t*);
+    struct _context_t *(*clone)(context_t*,struct WINE_CRYPTCERTSTORE*);
 } context_vtbl_t;
 
 typedef struct _context_t {
@@ -257,9 +261,6 @@ extern const WINE_CONTEXT_INTERFACE *pCertInterface DECLSPEC_HIDDEN;
 extern const WINE_CONTEXT_INTERFACE *pCRLInterface DECLSPEC_HIDDEN;
 extern const WINE_CONTEXT_INTERFACE *pCTLInterface DECLSPEC_HIDDEN;
 
-/* (Internal) certificate store types and functions */
-struct WINE_CRYPTCERTSTORE;
-
 typedef struct WINE_CRYPTCERTSTORE * (*StoreOpenFunc)(HCRYPTPROV hCryptProv,
  DWORD dwFlags, const void *pvPara);
 
@@ -454,7 +455,7 @@ struct ContextList;
 struct ContextList *ContextList_Create(
  const WINE_CONTEXT_INTERFACE *contextInterface, size_t contextSize) DECLSPEC_HIDDEN;
 
-void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace) DECLSPEC_HIDDEN;
+void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace, struct WINE_CRYPTCERTSTORE *store) DECLSPEC_HIDDEN;
 
 void *ContextList_Enum(struct ContextList *list, void *pPrev) DECLSPEC_HIDDEN;
 
diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c
index 26072ab..ed92f90 100644
--- a/dlls/crypt32/ctl.c
+++ b/dlls/crypt32/ctl.c
@@ -39,8 +39,21 @@ static void CTL_free(context_t *context)
     LocalFree(ctl->ctx.pCtlInfo);
 }
 
+static context_t *CTL_clone(context_t *context, WINECRYPT_CERTSTORE *store)
+{
+    ctl_t *ctl;
+
+    ctl = (ctl_t*)Context_CreateLinkContext(sizeof(CTL_CONTEXT), context);
+    if(!ctl)
+        return NULL;
+
+    ctl->ctx.hCertStore = store;
+    return &ctl->base;
+}
+
 static const context_vtbl_t ctl_vtbl = {
-    CTL_free
+    CTL_free,
+    CTL_clone
 };
 
 BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore,
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 1ba81c9..4f27e62 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -150,15 +150,13 @@ static BOOL MemStore_addCert(WINECRYPT_CERTSTORE *store, void *cert,
 
     TRACE("(%p, %p, %p, %p)\n", store, cert, toReplace, ppStoreContext);
 
-    context = ContextList_Add(ms->certs, cert, toReplace);
-    if (context)
-    {
-        context->hCertStore = store;
-        if (ppStoreContext) {
-            *ppStoreContext = CertDuplicateCertificateContext(context);
-        }
-    }
-    return context != 0;
+    context = ContextList_Add(ms->certs, cert, toReplace, store);
+    if (!context)
+        return FALSE;
+
+    if (ppStoreContext)
+        *ppStoreContext = CertDuplicateCertificateContext(context);
+    return TRUE;
 }
 
 static void *MemStore_enumCert(WINECRYPT_CERTSTORE *store, void *pPrev)
@@ -194,14 +192,13 @@ static BOOL MemStore_addCRL(WINECRYPT_CERTSTORE *store, void *crl,
 
     TRACE("(%p, %p, %p, %p)\n", store, crl, toReplace, ppStoreContext);
 
-    context = ContextList_Add(ms->crls, crl, toReplace);
-    if (context)
-    {
-        context->hCertStore = store;
-        if (ppStoreContext)
-            *ppStoreContext = CertDuplicateCRLContext(context);
-    }
-    return context != 0;
+    context = ContextList_Add(ms->crls, crl, toReplace, store);
+    if (!context)
+        return FALSE;
+
+    if (ppStoreContext)
+        *ppStoreContext = CertDuplicateCRLContext(context);
+    return TRUE;
 }
 
 static void *MemStore_enumCRL(WINECRYPT_CERTSTORE *store, void *pPrev)
@@ -237,14 +234,13 @@ static BOOL MemStore_addCTL(WINECRYPT_CERTSTORE *store, void *ctl,
 
     TRACE("(%p, %p, %p, %p)\n", store, ctl, toReplace, ppStoreContext);
 
-    context = ContextList_Add(ms->ctls, ctl, toReplace);
-    if (context)
-    {
-        context->hCertStore = store;
-        if (ppStoreContext)
-            *ppStoreContext = CertDuplicateCTLContext(context);
-    }
-    return context != 0;
+    context = ContextList_Add(ms->ctls, ctl, toReplace, store);
+    if (!context)
+        return FALSE;
+
+    if (ppStoreContext)
+        *ppStoreContext = CertDuplicateCTLContext(context);
+    return TRUE;
 }
 
 static void *MemStore_enumCTL(WINECRYPT_CERTSTORE *store, void *pPrev)




More information about the wine-cvs mailing list