crypt32: Moved store release implementation to vtbl.

This commit is contained in:
Jacek Caban 2013-10-14 14:45:43 +02:00 committed by Alexandre Julliard
parent b3b1135d84
commit 2256a728fe
4 changed files with 48 additions and 28 deletions

View File

@ -46,23 +46,30 @@ static void Collection_addref(WINECRYPT_CERTSTORE *store)
TRACE("ref = %d\n", ref); TRACE("ref = %d\n", ref);
} }
static void Collection_closeStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags) static DWORD Collection_release(WINECRYPT_CERTSTORE *store, DWORD flags)
{ {
WINE_COLLECTIONSTORE *cs = (WINE_COLLECTIONSTORE*)store; WINE_COLLECTIONSTORE *cs = (WINE_COLLECTIONSTORE*)store;
WINE_STORE_LIST_ENTRY *entry, *next; WINE_STORE_LIST_ENTRY *entry, *next;
LONG ref;
TRACE("(%p, %08x)\n", store, dwFlags); if(flags)
FIXME("Unimplemented flags %x\n", flags);
LIST_FOR_EACH_ENTRY_SAFE(entry, next, &cs->stores, WINE_STORE_LIST_ENTRY, ref = InterlockedDecrement(&cs->hdr.ref);
entry) TRACE("(%p) ref=%d\n", store, ref);
if(ref)
return ERROR_SUCCESS;
LIST_FOR_EACH_ENTRY_SAFE(entry, next, &cs->stores, WINE_STORE_LIST_ENTRY, entry)
{ {
TRACE("closing %p\n", entry); TRACE("closing %p\n", entry);
CertCloseStore(entry->store, dwFlags); entry->store->vtbl->release(entry->store, flags);
CryptMemFree(entry); CryptMemFree(entry);
} }
cs->cs.DebugInfo->Spare[0] = 0; cs->cs.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&cs->cs); DeleteCriticalSection(&cs->cs);
CRYPT_FreeStore(store); CRYPT_FreeStore(store);
return ERROR_SUCCESS;
} }
static void *CRYPT_CollectionCreateContextFromChild(WINE_COLLECTIONSTORE *store, static void *CRYPT_CollectionCreateContextFromChild(WINE_COLLECTIONSTORE *store,
@ -484,7 +491,7 @@ static BOOL Collection_control(WINECRYPT_CERTSTORE *cert_store, DWORD dwFlags,
static const store_vtbl_t CollectionStoreVtbl = { static const store_vtbl_t CollectionStoreVtbl = {
Collection_addref, Collection_addref,
Collection_closeStore, Collection_release,
Collection_control Collection_control
}; };

View File

@ -247,7 +247,7 @@ typedef struct _CONTEXT_PROPERTY_LIST CONTEXT_PROPERTY_LIST;
typedef struct { typedef struct {
void (*addref)(struct WINE_CRYPTCERTSTORE*); void (*addref)(struct WINE_CRYPTCERTSTORE*);
void (*closeStore)(struct WINE_CRYPTCERTSTORE*,DWORD); DWORD (*release)(struct WINE_CRYPTCERTSTORE*,DWORD);
BOOL (*control)(struct WINE_CRYPTCERTSTORE*,DWORD,DWORD,void const*); BOOL (*control)(struct WINE_CRYPTCERTSTORE*,DWORD,DWORD,void const*);
} store_vtbl_t; } store_vtbl_t;

View File

@ -47,17 +47,26 @@ static void ProvStore_addref(WINECRYPT_CERTSTORE *store)
TRACE("ref = %d\n", ref); TRACE("ref = %d\n", ref);
} }
static void ProvStore_closeStore(WINECRYPT_CERTSTORE *cert_store, DWORD dwFlags) static DWORD ProvStore_release(WINECRYPT_CERTSTORE *cert_store, DWORD flags)
{ {
WINE_PROVIDERSTORE *store = (WINE_PROVIDERSTORE*)cert_store; WINE_PROVIDERSTORE *store = (WINE_PROVIDERSTORE*)cert_store;
LONG ref;
TRACE("(%p, %08x)\n", store, dwFlags); if(flags)
FIXME("Unimplemented flags %x\n", flags);
ref = InterlockedDecrement(&store->hdr.ref);
TRACE("(%p) ref=%d\n", store, ref);
if(ref)
return ERROR_SUCCESS;
if (store->provCloseStore) if (store->provCloseStore)
store->provCloseStore(store->hStoreProv, dwFlags); store->provCloseStore(store->hStoreProv, flags);
if (!(store->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG)) if (!(store->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG))
CertCloseStore(store->memStore, dwFlags); store->memStore->vtbl->release(store->memStore, flags);
CRYPT_FreeStore((WINECRYPT_CERTSTORE*)store); CRYPT_FreeStore(&store->hdr);
return ERROR_SUCCESS;
} }
static BOOL CRYPT_ProvAddCert(WINECRYPT_CERTSTORE *store, void *cert, static BOOL CRYPT_ProvAddCert(WINECRYPT_CERTSTORE *store, void *cert,
@ -269,7 +278,7 @@ static BOOL ProvStore_control(WINECRYPT_CERTSTORE *cert_store, DWORD dwFlags, DW
static const store_vtbl_t ProvStoreVtbl = { static const store_vtbl_t ProvStoreVtbl = {
ProvStore_addref, ProvStore_addref,
ProvStore_closeStore, ProvStore_release,
ProvStore_control ProvStore_control
}; };

View File

@ -108,6 +108,7 @@ void CRYPT_FreeStore(WINECRYPT_CERTSTORE *store)
{ {
if (store->properties) if (store->properties)
ContextPropertyList_Free(store->properties); ContextPropertyList_Free(store->properties);
store->dwMagic = 0;
CryptMemFree(store); CryptMemFree(store);
} }
@ -290,18 +291,24 @@ static void MemStore_addref(WINECRYPT_CERTSTORE *store)
TRACE("ref = %d\n", ref); TRACE("ref = %d\n", ref);
} }
static void MemStore_closeStore(WINECRYPT_CERTSTORE *cert_store, DWORD dwFlags) static DWORD MemStore_release(WINECRYPT_CERTSTORE *cert_store, DWORD flags)
{ {
WINE_MEMSTORE *store = (WINE_MEMSTORE*)cert_store; WINE_MEMSTORE *store = (WINE_MEMSTORE*)cert_store;
LONG ref;
TRACE("(%p, %08x)\n", store, dwFlags); if(flags)
if (dwFlags) FIXME("Unimplemented flags %x\n", flags);
FIXME("Unimplemented flags: %08x\n", dwFlags);
ref = InterlockedDecrement(&store->hdr.ref);
TRACE("(%p) ref=%d\n", store, ref);
if(ref)
return ERROR_SUCCESS;
ContextList_Free(store->certs); ContextList_Free(store->certs);
ContextList_Free(store->crls); ContextList_Free(store->crls);
ContextList_Free(store->ctls); ContextList_Free(store->ctls);
CRYPT_FreeStore((WINECRYPT_CERTSTORE*)store); CRYPT_FreeStore(&store->hdr);
return ERROR_SUCCESS;
} }
static BOOL MemStore_control(WINECRYPT_CERTSTORE *store, DWORD dwFlags, static BOOL MemStore_control(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
@ -313,7 +320,7 @@ static BOOL MemStore_control(WINECRYPT_CERTSTORE *store, DWORD dwFlags,
static const store_vtbl_t MemStoreVtbl = { static const store_vtbl_t MemStoreVtbl = {
MemStore_addref, MemStore_addref,
MemStore_closeStore, MemStore_release,
MemStore_control MemStore_control
}; };
@ -1227,6 +1234,7 @@ HCERTSTORE WINAPI CertDuplicateStore(HCERTSTORE hCertStore)
BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags) BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
{ {
WINECRYPT_CERTSTORE *hcs = hCertStore; WINECRYPT_CERTSTORE *hcs = hCertStore;
DWORD res;
TRACE("(%p, %08x)\n", hCertStore, dwFlags); TRACE("(%p, %08x)\n", hCertStore, dwFlags);
@ -1236,16 +1244,12 @@ BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
if ( hcs->dwMagic != WINE_CRYPTCERTSTORE_MAGIC ) if ( hcs->dwMagic != WINE_CRYPTCERTSTORE_MAGIC )
return FALSE; return FALSE;
if (hcs->ref <= 0) res = hcs->vtbl->release(hcs, dwFlags);
ERR("%p's ref count is %d\n", hcs, hcs->ref); if (res != ERROR_SUCCESS) {
if (InterlockedDecrement(&hcs->ref) == 0) SetLastError(res);
{ return FALSE;
TRACE("%p's ref count is 0, freeing\n", hcs);
hcs->dwMagic = 0;
hcs->vtbl->closeStore(hcs, dwFlags);
} }
else
TRACE("%p's ref count is %d\n", hcs, hcs->ref);
return TRUE; return TRUE;
} }