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