Juan Lang : crypt32: When add-ref'ing a context, add-ref its linked contexts too.
Alexandre Julliard
julliard at winehq.org
Wed Nov 4 10:26:24 CST 2009
Module: wine
Branch: master
Commit: 5f81ad6821c5ae509ec84f29c15bf1c2192d22de
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5f81ad6821c5ae509ec84f29c15bf1c2192d22de
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Oct 30 17:25:28 2009 -0700
crypt32: When add-ref'ing a context, add-ref its linked contexts too.
---
dlls/crypt32/context.c | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c
index 20fe024..4d325c1 100644
--- a/dlls/crypt32/context.c
+++ b/dlls/crypt32/context.c
@@ -106,6 +106,34 @@ void Context_AddRef(void *context, size_t contextSize)
PBASE_CONTEXT baseContext = BASE_CONTEXT_FROM_CONTEXT(context, contextSize);
InterlockedIncrement(&baseContext->ref);
+ if (baseContext->type == ContextTypeLink)
+ {
+ void *linkedContext = Context_GetLinkedContext(context, contextSize);
+ PBASE_CONTEXT linkedBase = BASE_CONTEXT_FROM_CONTEXT(linkedContext,
+ contextSize);
+
+ /* Add-ref the linked contexts too */
+ while (linkedContext && linkedBase->type == ContextTypeLink)
+ {
+ InterlockedIncrement(&linkedBase->ref);
+ linkedContext = Context_GetLinkedContext(linkedContext,
+ contextSize);
+ if (linkedContext)
+ linkedBase = BASE_CONTEXT_FROM_CONTEXT(linkedContext,
+ contextSize);
+ else
+ linkedBase = NULL;
+ }
+ if (linkedContext)
+ {
+ /* It's not a link context, so it wasn't add-ref'ed in the while
+ * loop, so add-ref it here.
+ */
+ linkedBase = BASE_CONTEXT_FROM_CONTEXT(linkedContext,
+ contextSize);
+ InterlockedIncrement(&linkedBase->ref);
+ }
+ }
}
void *Context_GetExtra(const void *context, size_t contextSize)
More information about the wine-cvs
mailing list