Jacek Caban : crypt32: Added support for CERT_CLOSE_STORE_CHECK_FLAG flag in MemStore_release.

Alexandre Julliard julliard at winehq.org
Mon Oct 14 12:39:29 CDT 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Oct 14 14:45:53 2013 +0200

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 a584ec2..4de427c 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 221dfd7..25dd5f6 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();




More information about the wine-cvs mailing list