Module: wine Branch: refs/heads/master Commit: 78872852fd988fc56474dc95870160905895fc85 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=78872852fd988fc56474dc95...
Author: Juan Lang juan_lang@yahoo.com Date: Mon Mar 6 12:46:38 2006 -0800
crypt32: Simplify stores.
Ref count cert context references, and eliminate the DupCert function from stores.
---
dlls/crypt32/store.c | 115 ++++++++++---------------------------------------- 1 files changed, 22 insertions(+), 93 deletions(-)
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index 2ac2e10..fe37a56 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -144,8 +144,6 @@ typedef BOOL (*AddCertFunc)(struct WINE_ */ typedef void (*FreeCertFunc)(struct _WINE_CERT_CONTEXT_REF *ref);
-typedef PCCERT_CONTEXT (*DupCertFunc)(PCCERT_CONTEXT context); - typedef enum _CertStoreType { StoreTypeMem, StoreTypeCollection, @@ -170,7 +168,6 @@ typedef struct WINE_CRYPTCERTSTORE AddCertFunc addCert; EnumCertFunc enumCert; PFN_CERT_STORE_PROV_DELETE_CERT deleteCert; - DupCertFunc dupCert; FreeCertFunc freeCert; /* optional */ PFN_CERT_STORE_PROV_CONTROL control; /* optional */ } WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE; @@ -193,7 +190,8 @@ typedef struct _WINE_CERT_CONTEXT
typedef struct _WINE_CERT_CONTEXT_REF { - CERT_CONTEXT cert; + CERT_CONTEXT cert; + LONG ref; WINE_CERT_CONTEXT *context; } WINE_CERT_CONTEXT_REF, *PWINE_CERT_CONTEXT_REF;
@@ -326,6 +324,7 @@ static void CRYPT_InitCertRef(PWINE_CERT { TRACE("(%p, %p)\n", ref, context); memcpy(&ref->cert, context, sizeof(ref->cert)); + ref->ref = 1; ref->context = context; InterlockedIncrement(&context->ref); TRACE("%p's ref count is %ld\n", context, context->ref); @@ -532,21 +531,6 @@ static void WINAPI CRYPT_MemCloseStore(H CryptMemFree(store); }
-static PCCERT_CONTEXT CRYPT_MemDupCert(PCCERT_CONTEXT pCertContext) -{ - const WINE_CERT_LIST_ENTRY *context = - (const WINE_CERT_LIST_ENTRY *)pCertContext; - PWINE_CERT_LIST_ENTRY ret; - - ret = CryptMemAlloc(sizeof(WINE_CERT_LIST_ENTRY)); - if (ret) - { - memcpy(ret, context, sizeof(WINE_CERT_LIST_ENTRY)); - InterlockedIncrement(&ret->cert.context->ref); - } - return (PCCERT_CONTEXT)ret; -} - static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara) { @@ -571,7 +555,6 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpe store->hdr.enumCert = CRYPT_MemEnumCert; store->hdr.deleteCert = CRYPT_MemDeleteCert; store->hdr.freeCert = NULL; - store->hdr.dupCert = CRYPT_MemDupCert; store->hdr.control = NULL; InitializeCriticalSection(&store->cs); list_init(&store->certs); @@ -749,21 +732,6 @@ static BOOL WINAPI CRYPT_CollectionDelet return ret; }
-static PCCERT_CONTEXT CRYPT_CollectionDupCert(PCCERT_CONTEXT pCertContext) -{ - const WINE_COLLECTION_CERT_CONTEXT *context = - (const WINE_COLLECTION_CERT_CONTEXT *)pCertContext; - PWINE_COLLECTION_CERT_CONTEXT ret; - - ret = CryptMemAlloc(sizeof(WINE_COLLECTION_CERT_CONTEXT)); - if (ret) - { - memcpy(ret, context, sizeof(WINE_COLLECTION_CERT_CONTEXT)); - InterlockedIncrement(&ret->cert.context->ref); - } - return (PCCERT_CONTEXT)ret; -} - static void CRYPT_CollectionFreeCert(PWINE_CERT_CONTEXT_REF ref) { PWINE_COLLECTION_CERT_CONTEXT context = (PWINE_COLLECTION_CERT_CONTEXT)ref; @@ -796,7 +764,6 @@ static WINECRYPT_CERTSTORE *CRYPT_Collec store->hdr.addCert = CRYPT_CollectionAddCert; store->hdr.enumCert = CRYPT_CollectionEnumCert; store->hdr.deleteCert = CRYPT_CollectionDeleteCert; - store->hdr.dupCert = CRYPT_CollectionDupCert; store->hdr.freeCert = CRYPT_CollectionFreeCert; InitializeCriticalSection(&store->cs); list_init(&store->stores); @@ -887,21 +854,6 @@ static PWINE_CERT_CONTEXT_REF CRYPT_Prov return (PWINE_CERT_CONTEXT_REF)ret; }
-static PCCERT_CONTEXT CRYPT_ProvDupCert(PCCERT_CONTEXT pCertContext) -{ - const WINE_PROV_CERT_CONTEXT *context = - (const WINE_PROV_CERT_CONTEXT *)pCertContext; - PWINE_PROV_CERT_CONTEXT ret; - - ret = CryptMemAlloc(sizeof(WINE_PROV_CERT_CONTEXT)); - if (ret) - { - memcpy(ret, context, sizeof(WINE_PROV_CERT_CONTEXT)); - InterlockedIncrement(&ret->cert.context->ref); - } - return (PCCERT_CONTEXT)ret; -} - static BOOL WINAPI CRYPT_ProvDeleteCert(HCERTSTORE hCertStore, PCCERT_CONTEXT cert, DWORD dwFlags) { @@ -965,7 +917,6 @@ static PWINECRYPT_CERTSTORE CRYPT_ProvCr ret->hdr.addCert = CRYPT_ProvAddCert; ret->hdr.enumCert = CRYPT_ProvEnumCert; ret->hdr.deleteCert = CRYPT_ProvDeleteCert; - ret->hdr.dupCert = CRYPT_ProvDupCert; ret->hdr.freeCert = CRYPT_ProvFreeCert; ret->hdr.control = CRYPT_ProvControl; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC) @@ -2337,33 +2288,11 @@ BOOL WINAPI CertSetCertificateContextPro PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext( PCCERT_CONTEXT pCertContext) { - PCCERT_CONTEXT ret; + PWINE_CERT_CONTEXT_REF context = (PWINE_CERT_CONTEXT_REF)pCertContext;
TRACE("(%p)\n", pCertContext); - if (pCertContext->hCertStore) - { - PWINECRYPT_CERTSTORE store = - (PWINECRYPT_CERTSTORE)pCertContext->hCertStore; - - ret = store->dupCert(pCertContext); - } - else - { - PWINE_CERT_CONTEXT_REF context = (PWINE_CERT_CONTEXT_REF)pCertContext, - ref; - - ref = CryptMemAlloc(sizeof(WINE_CERT_CONTEXT_REF)); - if (ref) - { - memcpy(ref, context, sizeof(*ret)); - ref->cert.hCertStore = 0; - InterlockedIncrement(&ref->context->ref); - ret = (PCCERT_CONTEXT)ref; - } - else - ret = NULL; - } - return (PCCERT_CONTEXT)ret; + InterlockedIncrement(&context->ref); + return pCertContext; }
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore, @@ -2694,31 +2623,31 @@ BOOL WINAPI CertSetCTLContextProperty(PC
static void CRYPT_UnrefCertificateContext(PWINE_CERT_CONTEXT_REF ref) { - if (InterlockedDecrement(&ref->context->ref) == 0) - { - TRACE("%p's ref count is 0, freeing\n", ref->context); - CRYPT_FreeCert(ref->context); - } - else - TRACE("%p's ref count is %ld\n", ref->context, ref->context->ref); -} - -BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext) -{ - TRACE("(%p)\n", pCertContext); - - if (pCertContext) + if (InterlockedDecrement(&ref->ref) == 0) { - PWINE_CERT_CONTEXT_REF ref = (PWINE_CERT_CONTEXT_REF)pCertContext; PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)ref->cert.hCertStore;
- CRYPT_UnrefCertificateContext(ref); + if (InterlockedDecrement(&ref->context->ref) == 0) + { + TRACE("%p's ref count is 0, freeing\n", ref->context); + CRYPT_FreeCert(ref->context); + } + else + TRACE("%p's ref count is %ld\n", ref->context, ref->context->ref); if (store && store->dwMagic == WINE_CRYPTCERTSTORE_MAGIC && store->freeCert) store->freeCert(ref); TRACE("freeing %p\n", ref); CryptMemFree(ref); } +} + +BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext) +{ + TRACE("(%p)\n", pCertContext); + + if (pCertContext) + CRYPT_UnrefCertificateContext((PWINE_CERT_CONTEXT_REF)pCertContext); return TRUE; }