crypt32: Test and fix a couple CertAddCertificateContextToStore corner cases.
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index c150229..160cfdd 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -2044,6 +2044,12 @@
TRACE("(%p, %p, %08lx, %p)\n", hCertStore, pCertContext,
dwAddDisposition, ppStoreContext);
+ /* Weird case to pass a test */
+ if (dwAddDisposition == 0)
+ {
+ SetLastError(STATUS_ACCESS_VIOLATION);
+ return FALSE;
+ }
if (dwAddDisposition != CERT_STORE_ADD_ALWAYS)
{
BYTE hashToAdd[20];
@@ -2095,8 +2101,11 @@
if (toAdd)
{
- ret = store->certs.addContext(store, (void *)toAdd, (void *)existing,
- (const void **)ppStoreContext);
+ if (store)
+ ret = store->certs.addContext(store, (void *)toAdd,
+ (void *)existing, (const void **)ppStoreContext);
+ else if (ppStoreContext)
+ *ppStoreContext = CertDuplicateCertificateContext(toAdd);
CertFreeCertificateContext(toAdd);
}
CertFreeCertificateContext(existing);
diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c
index a3624f1..3d487ac 100644
--- a/dlls/crypt32/tests/store.c
+++ b/dlls/crypt32/tests/store.c
@@ -152,6 +152,28 @@
PCCERT_CONTEXT context;
BOOL ret;
+ /* Weird--bad add disposition leads to an access violation in Windows.
+ */
+ ret = CertAddEncodedCertificateToStore(0, X509_ASN_ENCODING, bigCert,
+ sizeof(bigCert), 0, NULL);
+ ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION,
+ "Expected STATUS_ACCESS_VIOLATION, got %08lx\n", GetLastError());
+ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
+ bigCert, sizeof(bigCert), 0, NULL);
+ ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION,
+ "Expected STATUS_ACCESS_VIOLATION, got %08lx\n", GetLastError());
+
+ /* Weird--can add a cert to the NULL store (does this have special
+ * meaning?)
+ */
+ context = NULL;
+ ret = CertAddEncodedCertificateToStore(0, X509_ASN_ENCODING, bigCert,
+ sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &context);
+ ok(ret, "CertAddEncodedCertificateToStore failed: %08lx\n",
+ GetLastError());
+ if (context)
+ CertFreeCertificateContext(context);
+
ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "CertAddEncodedCertificateToStore failed: %08lx\n",