crypt32: Simplify stores.
Ref count cert context references, and eliminate the DupCert function from stores.
This commit is contained in:
parent
a401f3c4bb
commit
78872852fd
|
@ -144,8 +144,6 @@ typedef BOOL (*AddCertFunc)(struct WINE_CRYPTCERTSTORE *store,
|
||||||
*/
|
*/
|
||||||
typedef void (*FreeCertFunc)(struct _WINE_CERT_CONTEXT_REF *ref);
|
typedef void (*FreeCertFunc)(struct _WINE_CERT_CONTEXT_REF *ref);
|
||||||
|
|
||||||
typedef PCCERT_CONTEXT (*DupCertFunc)(PCCERT_CONTEXT context);
|
|
||||||
|
|
||||||
typedef enum _CertStoreType {
|
typedef enum _CertStoreType {
|
||||||
StoreTypeMem,
|
StoreTypeMem,
|
||||||
StoreTypeCollection,
|
StoreTypeCollection,
|
||||||
|
@ -170,7 +168,6 @@ typedef struct WINE_CRYPTCERTSTORE
|
||||||
AddCertFunc addCert;
|
AddCertFunc addCert;
|
||||||
EnumCertFunc enumCert;
|
EnumCertFunc enumCert;
|
||||||
PFN_CERT_STORE_PROV_DELETE_CERT deleteCert;
|
PFN_CERT_STORE_PROV_DELETE_CERT deleteCert;
|
||||||
DupCertFunc dupCert;
|
|
||||||
FreeCertFunc freeCert; /* optional */
|
FreeCertFunc freeCert; /* optional */
|
||||||
PFN_CERT_STORE_PROV_CONTROL control; /* optional */
|
PFN_CERT_STORE_PROV_CONTROL control; /* optional */
|
||||||
} WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
|
} WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE;
|
||||||
|
@ -193,7 +190,8 @@ typedef struct _WINE_CERT_CONTEXT
|
||||||
|
|
||||||
typedef struct _WINE_CERT_CONTEXT_REF
|
typedef struct _WINE_CERT_CONTEXT_REF
|
||||||
{
|
{
|
||||||
CERT_CONTEXT cert;
|
CERT_CONTEXT cert;
|
||||||
|
LONG ref;
|
||||||
WINE_CERT_CONTEXT *context;
|
WINE_CERT_CONTEXT *context;
|
||||||
} WINE_CERT_CONTEXT_REF, *PWINE_CERT_CONTEXT_REF;
|
} WINE_CERT_CONTEXT_REF, *PWINE_CERT_CONTEXT_REF;
|
||||||
|
|
||||||
|
@ -326,6 +324,7 @@ static void CRYPT_InitCertRef(PWINE_CERT_CONTEXT_REF ref,
|
||||||
{
|
{
|
||||||
TRACE("(%p, %p)\n", ref, context);
|
TRACE("(%p, %p)\n", ref, context);
|
||||||
memcpy(&ref->cert, context, sizeof(ref->cert));
|
memcpy(&ref->cert, context, sizeof(ref->cert));
|
||||||
|
ref->ref = 1;
|
||||||
ref->context = context;
|
ref->context = context;
|
||||||
InterlockedIncrement(&context->ref);
|
InterlockedIncrement(&context->ref);
|
||||||
TRACE("%p's ref count is %ld\n", context, context->ref);
|
TRACE("%p's ref count is %ld\n", context, context->ref);
|
||||||
|
@ -532,21 +531,6 @@ static void WINAPI CRYPT_MemCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
|
||||||
CryptMemFree(store);
|
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,
|
static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
|
||||||
DWORD dwFlags, const void *pvPara)
|
DWORD dwFlags, const void *pvPara)
|
||||||
{
|
{
|
||||||
|
@ -571,7 +555,6 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv,
|
||||||
store->hdr.enumCert = CRYPT_MemEnumCert;
|
store->hdr.enumCert = CRYPT_MemEnumCert;
|
||||||
store->hdr.deleteCert = CRYPT_MemDeleteCert;
|
store->hdr.deleteCert = CRYPT_MemDeleteCert;
|
||||||
store->hdr.freeCert = NULL;
|
store->hdr.freeCert = NULL;
|
||||||
store->hdr.dupCert = CRYPT_MemDupCert;
|
|
||||||
store->hdr.control = NULL;
|
store->hdr.control = NULL;
|
||||||
InitializeCriticalSection(&store->cs);
|
InitializeCriticalSection(&store->cs);
|
||||||
list_init(&store->certs);
|
list_init(&store->certs);
|
||||||
|
@ -749,21 +732,6 @@ static BOOL WINAPI CRYPT_CollectionDeleteCert(HCERTSTORE hCertStore,
|
||||||
return ret;
|
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)
|
static void CRYPT_CollectionFreeCert(PWINE_CERT_CONTEXT_REF ref)
|
||||||
{
|
{
|
||||||
PWINE_COLLECTION_CERT_CONTEXT context = (PWINE_COLLECTION_CERT_CONTEXT)ref;
|
PWINE_COLLECTION_CERT_CONTEXT context = (PWINE_COLLECTION_CERT_CONTEXT)ref;
|
||||||
|
@ -796,7 +764,6 @@ static WINECRYPT_CERTSTORE *CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv,
|
||||||
store->hdr.addCert = CRYPT_CollectionAddCert;
|
store->hdr.addCert = CRYPT_CollectionAddCert;
|
||||||
store->hdr.enumCert = CRYPT_CollectionEnumCert;
|
store->hdr.enumCert = CRYPT_CollectionEnumCert;
|
||||||
store->hdr.deleteCert = CRYPT_CollectionDeleteCert;
|
store->hdr.deleteCert = CRYPT_CollectionDeleteCert;
|
||||||
store->hdr.dupCert = CRYPT_CollectionDupCert;
|
|
||||||
store->hdr.freeCert = CRYPT_CollectionFreeCert;
|
store->hdr.freeCert = CRYPT_CollectionFreeCert;
|
||||||
InitializeCriticalSection(&store->cs);
|
InitializeCriticalSection(&store->cs);
|
||||||
list_init(&store->stores);
|
list_init(&store->stores);
|
||||||
|
@ -887,21 +854,6 @@ static PWINE_CERT_CONTEXT_REF CRYPT_ProvEnumCert(PWINECRYPT_CERTSTORE store,
|
||||||
return (PWINE_CERT_CONTEXT_REF)ret;
|
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,
|
static BOOL WINAPI CRYPT_ProvDeleteCert(HCERTSTORE hCertStore,
|
||||||
PCCERT_CONTEXT cert, DWORD dwFlags)
|
PCCERT_CONTEXT cert, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
|
@ -965,7 +917,6 @@ static PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(HCRYPTPROV hCryptProv,
|
||||||
ret->hdr.addCert = CRYPT_ProvAddCert;
|
ret->hdr.addCert = CRYPT_ProvAddCert;
|
||||||
ret->hdr.enumCert = CRYPT_ProvEnumCert;
|
ret->hdr.enumCert = CRYPT_ProvEnumCert;
|
||||||
ret->hdr.deleteCert = CRYPT_ProvDeleteCert;
|
ret->hdr.deleteCert = CRYPT_ProvDeleteCert;
|
||||||
ret->hdr.dupCert = CRYPT_ProvDupCert;
|
|
||||||
ret->hdr.freeCert = CRYPT_ProvFreeCert;
|
ret->hdr.freeCert = CRYPT_ProvFreeCert;
|
||||||
ret->hdr.control = CRYPT_ProvControl;
|
ret->hdr.control = CRYPT_ProvControl;
|
||||||
if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC)
|
if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC)
|
||||||
|
@ -2337,33 +2288,11 @@ BOOL WINAPI CertSetCertificateContextProperty(PCCERT_CONTEXT pCertContext,
|
||||||
PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(
|
PCCERT_CONTEXT WINAPI CertDuplicateCertificateContext(
|
||||||
PCCERT_CONTEXT pCertContext)
|
PCCERT_CONTEXT pCertContext)
|
||||||
{
|
{
|
||||||
PCCERT_CONTEXT ret;
|
PWINE_CERT_CONTEXT_REF context = (PWINE_CERT_CONTEXT_REF)pCertContext;
|
||||||
|
|
||||||
TRACE("(%p)\n", pCertContext);
|
TRACE("(%p)\n", pCertContext);
|
||||||
if (pCertContext->hCertStore)
|
InterlockedIncrement(&context->ref);
|
||||||
{
|
return pCertContext;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
|
BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
|
||||||
|
@ -2694,13 +2623,23 @@ BOOL WINAPI CertSetCTLContextProperty(PCCTL_CONTEXT pCTLContext,
|
||||||
|
|
||||||
static void CRYPT_UnrefCertificateContext(PWINE_CERT_CONTEXT_REF ref)
|
static void CRYPT_UnrefCertificateContext(PWINE_CERT_CONTEXT_REF ref)
|
||||||
{
|
{
|
||||||
if (InterlockedDecrement(&ref->context->ref) == 0)
|
if (InterlockedDecrement(&ref->ref) == 0)
|
||||||
{
|
{
|
||||||
TRACE("%p's ref count is 0, freeing\n", ref->context);
|
PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)ref->cert.hCertStore;
|
||||||
CRYPT_FreeCert(ref->context);
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
TRACE("%p's ref count is %ld\n", ref->context, ref->context->ref);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
|
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
|
||||||
|
@ -2708,17 +2647,7 @@ BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
|
||||||
TRACE("(%p)\n", pCertContext);
|
TRACE("(%p)\n", pCertContext);
|
||||||
|
|
||||||
if (pCertContext)
|
if (pCertContext)
|
||||||
{
|
CRYPT_UnrefCertificateContext((PWINE_CERT_CONTEXT_REF)pCertContext);
|
||||||
PWINE_CERT_CONTEXT_REF ref = (PWINE_CERT_CONTEXT_REF)pCertContext;
|
|
||||||
PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)ref->cert.hCertStore;
|
|
||||||
|
|
||||||
CRYPT_UnrefCertificateContext(ref);
|
|
||||||
if (store && store->dwMagic == WINE_CRYPTCERTSTORE_MAGIC &&
|
|
||||||
store->freeCert)
|
|
||||||
store->freeCert(ref);
|
|
||||||
TRACE("freeing %p\n", ref);
|
|
||||||
CryptMemFree(ref);
|
|
||||||
}
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue