Module: wine Branch: master Commit: 5f81ad6821c5ae509ec84f29c15bf1c2192d22de URL: http://source.winehq.org/git/wine.git/?a=commit;h=5f81ad6821c5ae509ec84f29c1...
Author: Juan Lang juan.lang@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)