Juan Lang : crypt32: Add return value to Context_Release to allow detecting reference counting errors .

Alexandre Julliard julliard at winehq.org
Wed Nov 4 10:26:24 CST 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Oct 30 15:06:39 2009 -0700

crypt32: Add return value to Context_Release to allow detecting reference counting errors.

---

 dlls/crypt32/cert.c            |    6 ++++--
 dlls/crypt32/context.c         |    8 ++++++--
 dlls/crypt32/crl.c             |    6 ++++--
 dlls/crypt32/crypt32_private.h |    3 ++-
 dlls/crypt32/ctl.c             |    6 ++++--
 5 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 2a65290..4f3df32 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -180,12 +180,14 @@ static void CertDataContext_Free(void *context)
 
 BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
 {
+    BOOL ret = TRUE;
+
     TRACE("(%p)\n", pCertContext);
 
     if (pCertContext)
-        Context_Release((void *)pCertContext, sizeof(CERT_CONTEXT),
+        ret = Context_Release((void *)pCertContext, sizeof(CERT_CONTEXT),
          CertDataContext_Free);
-    return TRUE;
+    return ret;
 }
 
 DWORD WINAPI CertEnumCertificateContextProperties(PCCERT_CONTEXT pCertContext,
diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c
index bb87799..9ada6bf 100644
--- a/dlls/crypt32/context.c
+++ b/dlls/crypt32/context.c
@@ -135,11 +135,14 @@ PCONTEXT_PROPERTY_LIST Context_GetProperties(const void *context, size_t context
      ((PDATA_CONTEXT)ptr)->properties : NULL;
 }
 
-void Context_Release(void *context, size_t contextSize,
+BOOL Context_Release(void *context, size_t contextSize,
  ContextFreeFunc dataContextFree)
 {
     PBASE_CONTEXT base = BASE_CONTEXT_FROM_CONTEXT(context, contextSize);
+    BOOL ret = TRUE;
 
+    if (base->ref <= 0)
+        return FALSE;
     if (InterlockedDecrement(&base->ref) == 0)
     {
         TRACE("freeing %p\n", context);
@@ -153,7 +156,7 @@ void Context_Release(void *context, size_t contextSize,
             /* The linked context is of the same type as this, so release
              * it as well, using the same offset and data free function.
              */
-            Context_Release(CONTEXT_FROM_BASE_CONTEXT(
+            ret = Context_Release(CONTEXT_FROM_BASE_CONTEXT(
              ((PLINK_CONTEXT)base)->linked, contextSize), contextSize,
              dataContextFree);
             break;
@@ -164,6 +167,7 @@ void Context_Release(void *context, size_t contextSize,
     }
     else
         TRACE("%p's ref count is %d\n", context, base->ref);
+    return ret;
 }
 
 void Context_CopyProperties(const void *to, const void *from,
diff --git a/dlls/crypt32/crl.c b/dlls/crypt32/crl.c
index 80fe86f..522aadf 100644
--- a/dlls/crypt32/crl.c
+++ b/dlls/crypt32/crl.c
@@ -243,12 +243,14 @@ static void CrlDataContext_Free(void *context)
 
 BOOL WINAPI CertFreeCRLContext( PCCRL_CONTEXT pCrlContext)
 {
+    BOOL ret = TRUE;
+
     TRACE("(%p)\n", pCrlContext);
 
     if (pCrlContext)
-        Context_Release((void *)pCrlContext, sizeof(CRL_CONTEXT),
+        ret = Context_Release((void *)pCrlContext, sizeof(CRL_CONTEXT),
          CrlDataContext_Free);
-    return TRUE;
+    return ret;
 }
 
 DWORD WINAPI CertEnumCRLContextProperties(PCCRL_CONTEXT pCRLContext,
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index 8c5b13b..dd96e0f 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -346,8 +346,9 @@ typedef void (*ContextFreeFunc)(void *context);
 /* Decrements context's ref count.  If context is a link context, releases its
  * linked context as well.
  * If a data context has its ref count reach 0, calls dataContextFree on it.
+ * Returns FALSE if the reference count is <= 0 when called.
  */
-void Context_Release(void *context, size_t contextSize,
+BOOL Context_Release(void *context, size_t contextSize,
  ContextFreeFunc dataContextFree);
 
 /**
diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c
index 1bd60e7..e2511fa 100644
--- a/dlls/crypt32/ctl.c
+++ b/dlls/crypt32/ctl.c
@@ -472,12 +472,14 @@ static void CTLDataContext_Free(void *context)
 
 BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCTLContext)
 {
+    BOOL ret = TRUE;
+
     TRACE("(%p)\n", pCTLContext);
 
     if (pCTLContext)
-        Context_Release((void *)pCTLContext, sizeof(CTL_CONTEXT),
+        ret = Context_Release((void *)pCTLContext, sizeof(CTL_CONTEXT),
          CTLDataContext_Free);
-    return TRUE;
+    return ret;
 }
 
 DWORD WINAPI CertEnumCTLContextProperties(PCCTL_CONTEXT pCTLContext,




More information about the wine-cvs mailing list