From 9204582c14c2d857d4fd682a22b71bbc26d82d2b Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Fri, 30 Oct 2009 17:25:28 -0700 Subject: [PATCH] crypt32: When add-ref'ing a context, add-ref its linked contexts too. --- dlls/crypt32/context.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c index 20fe0245f8..4d325c15e4 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) -- 2.33.8