From be023607cc7297f03844c33449125b482e60436e Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 14 Oct 2013 14:45:53 +0200 Subject: [PATCH] crypt32: Added support for CERT_CLOSE_STORE_CHECK_FLAG flag in MemStore_release. --- dlls/crypt32/store.c | 4 ++-- dlls/crypt32/tests/store.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index a584ec27413..4de427c23d0 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -296,13 +296,13 @@ static DWORD MemStore_release(WINECRYPT_CERTSTORE *cert_store, DWORD flags) WINE_MEMSTORE *store = (WINE_MEMSTORE*)cert_store; LONG ref; - if(flags) + if(flags & ~CERT_CLOSE_STORE_CHECK_FLAG) FIXME("Unimplemented flags %x\n", flags); ref = InterlockedDecrement(&store->hdr.ref); TRACE("(%p) ref=%d\n", store, ref); if(ref) - return ERROR_SUCCESS; + return (flags & CERT_CLOSE_STORE_CHECK_FLAG) ? CRYPT_E_PENDING_CLOSE : ERROR_SUCCESS; ContextList_Free(store->certs); ContextList_Free(store->crls); diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c index 221dfd7f2dd..25dd5f67fb2 100644 --- a/dlls/crypt32/tests/store.c +++ b/dlls/crypt32/tests/store.c @@ -2557,10 +2557,41 @@ static void testEmptyStore(void) CertCloseStore(store, 0); + res = CertCloseStore(cert->hCertStore, CERT_CLOSE_STORE_CHECK_FLAG); + ok(!res && GetLastError() == E_UNEXPECTED, "CertCloseStore returned: %x(%x)\n", res, GetLastError()); + + res = CertCloseStore(cert->hCertStore, 0); + ok(!res && GetLastError() == E_UNEXPECTED, "CertCloseStore returned: %x(%x)\n", res, GetLastError()); + CertFreeCertificateContext(cert2); CertFreeCertificateContext(cert); } +static void testCloseStore(void) +{ + HCERTSTORE store, store2; + BOOL res; + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); + ok(store != NULL, "CertOpenStore failed\n"); + + res = CertCloseStore(store, CERT_CLOSE_STORE_CHECK_FLAG); + ok(res, "CertCloseStore failed\n"); + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); + ok(store != NULL, "CertOpenStore failed\n"); + + store2 = CertDuplicateStore(store); + ok(store2 != NULL, "CertCloneStore failed\n"); + ok(store2 == store, "unexpected store2\n"); + + res = CertCloseStore(store, CERT_CLOSE_STORE_CHECK_FLAG); + ok(!res && GetLastError() == CRYPT_E_PENDING_CLOSE, "CertCloseStore failed\n"); + + res = CertCloseStore(store2, CERT_CLOSE_STORE_CHECK_FLAG); + ok(res, "CertCloseStore failed\n"); +} + static void test_I_UpdateStore(void) { HMODULE lib = GetModuleHandleA("crypt32"); @@ -2659,6 +2690,7 @@ START_TEST(store) testFileNameStore(); testMessageStore(); testSerializedStore(); + testCloseStore(); testCertOpenSystemStore(); testCertEnumSystemStore();