crypt32: Release a link context's linked context on every release, not just when it reaches 0.
This commit is contained in:
parent
52820b9cf8
commit
17894eb093
|
@ -171,25 +171,22 @@ BOOL Context_Release(void *context, size_t contextSize,
|
||||||
|
|
||||||
if (base->ref <= 0)
|
if (base->ref <= 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (base->type == ContextTypeLink)
|
||||||
|
{
|
||||||
|
/* The linked context is of the same type as this, so release
|
||||||
|
* it as well, using the same offset and data free function.
|
||||||
|
*/
|
||||||
|
ret = Context_Release(CONTEXT_FROM_BASE_CONTEXT(
|
||||||
|
((PLINK_CONTEXT)base)->linked, contextSize), contextSize,
|
||||||
|
dataContextFree);
|
||||||
|
}
|
||||||
if (InterlockedDecrement(&base->ref) == 0)
|
if (InterlockedDecrement(&base->ref) == 0)
|
||||||
{
|
{
|
||||||
TRACE("freeing %p\n", context);
|
TRACE("freeing %p\n", context);
|
||||||
switch (base->type)
|
if (base->type == ContextTypeData)
|
||||||
{
|
{
|
||||||
case ContextTypeData:
|
|
||||||
ContextPropertyList_Free(((PDATA_CONTEXT)base)->properties);
|
ContextPropertyList_Free(((PDATA_CONTEXT)base)->properties);
|
||||||
dataContextFree(context);
|
dataContextFree(context);
|
||||||
break;
|
|
||||||
case ContextTypeLink:
|
|
||||||
/* The linked context is of the same type as this, so release
|
|
||||||
* it as well, using the same offset and data free function.
|
|
||||||
*/
|
|
||||||
ret = Context_Release(CONTEXT_FROM_BASE_CONTEXT(
|
|
||||||
((PLINK_CONTEXT)base)->linked, contextSize), contextSize,
|
|
||||||
dataContextFree);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
}
|
||||||
CryptMemFree(context);
|
CryptMemFree(context);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue