Module: wine Branch: master Commit: ad912961db613daae200eb1d05d7496a1bd3a840 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ad912961db613daae200eb1d05...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Oct 8 16:23:48 2013 +0200
crypt32: Allocate BASE_CONTEXT in the beginning of the memory block.
---
dlls/crypt32/context.c | 105 +++++++++++++++++++++--------------------------- dlls/crypt32/store.c | 3 +- 2 files changed, 48 insertions(+), 60 deletions(-)
diff --git a/dlls/crypt32/context.c b/dlls/crypt32/context.c index e52f096..19fe98a 100644 --- a/dlls/crypt32/context.c +++ b/dlls/crypt32/context.c @@ -41,123 +41,110 @@ typedef struct _BASE_CONTEXT } u; } BASE_CONTEXT;
-#define CONTEXT_FROM_BASE_CONTEXT(p, s) ((LPBYTE)(p) - (s)) -#define BASE_CONTEXT_FROM_CONTEXT(p, s) (BASE_CONTEXT*)((LPBYTE)(p) + (s)) +#define CONTEXT_FROM_BASE_CONTEXT(p) (LPBYTE)(p+1) +#define BASE_CONTEXT_FROM_CONTEXT(p) ((BASE_CONTEXT*)(p)-1)
void *Context_CreateDataContext(size_t contextSize) { - void *ret = CryptMemAlloc(contextSize + sizeof(BASE_CONTEXT)); + BASE_CONTEXT *context;
- if (ret) - { - BASE_CONTEXT *context = (BASE_CONTEXT*)((LPBYTE)ret + contextSize); + context = CryptMemAlloc(contextSize + sizeof(BASE_CONTEXT)); + if (!context) + return NULL;
- context->ref = 1; - context->type = ContextTypeData; - context->u.properties = ContextPropertyList_Create(); - if (!context->u.properties) - { - CryptMemFree(ret); - ret = NULL; - } + context->ref = 1; + context->type = ContextTypeData; + context->u.properties = ContextPropertyList_Create(); + if (!context->u.properties) + { + CryptMemFree(context); + return NULL; } - TRACE("returning %p\n", ret); - return ret; + + TRACE("returning %p\n", context); + return CONTEXT_FROM_BASE_CONTEXT(context); }
void *Context_CreateLinkContext(unsigned int contextSize, void *linked, unsigned int extra, BOOL addRef) { - void *context = CryptMemAlloc(contextSize + sizeof(BASE_CONTEXT) + extra); + BASE_CONTEXT *context;
TRACE("(%d, %p, %d)\n", contextSize, linked, extra);
- if (context) - { - BASE_CONTEXT *linkContext = (BASE_CONTEXT*)BASE_CONTEXT_FROM_CONTEXT( - context, contextSize); - BASE_CONTEXT *linkedBase = BASE_CONTEXT_FROM_CONTEXT(linked, - contextSize); - - memcpy(context, linked, contextSize); - linkContext->ref = 1; - linkContext->type = ContextTypeLink; - linkContext->u.linked = linkedBase; - if (addRef) - Context_AddRef(linked, contextSize); - TRACE("%p's ref count is %d\n", context, linkContext->ref); - } + context = CryptMemAlloc(contextSize + sizeof(BASE_CONTEXT) + extra); + if (!context) + return NULL; + + memcpy(CONTEXT_FROM_BASE_CONTEXT(context), linked, contextSize); + context->ref = 1; + context->type = ContextTypeLink; + context->u.linked = BASE_CONTEXT_FROM_CONTEXT(linked); + if (addRef) + Context_AddRef(linked, contextSize); + TRACE("returning %p\n", context); - return context; + return CONTEXT_FROM_BASE_CONTEXT(context); }
void Context_AddRef(void *context, size_t contextSize) { - BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context, contextSize); + BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context);
InterlockedIncrement(&baseContext->ref); TRACE("%p's ref count is %d\n", context, baseContext->ref); if (baseContext->type == ContextTypeLink) { - void *linkedContext = Context_GetLinkedContext(context, contextSize); - BASE_CONTEXT *linkedBase = BASE_CONTEXT_FROM_CONTEXT(linkedContext, - contextSize); + BASE_CONTEXT *linkedBase = baseContext->u.linked;
/* Add-ref the linked contexts too */ - while (linkedContext && linkedBase->type == ContextTypeLink) + while (linkedBase && linkedBase->type == ContextTypeLink) { InterlockedIncrement(&linkedBase->ref); - TRACE("%p's ref count is %d\n", linkedContext, linkedBase->ref); - linkedContext = Context_GetLinkedContext(linkedContext, - contextSize); - if (linkedContext) - linkedBase = BASE_CONTEXT_FROM_CONTEXT(linkedContext, - contextSize); - else - linkedBase = NULL; + TRACE("%p's ref count is %d\n", linkedBase, linkedBase->ref); + linkedBase = linkedBase->u.linked; } - if (linkedContext) + if (linkedBase) { /* 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); - TRACE("%p's ref count is %d\n", linkedContext, linkedBase->ref); + TRACE("%p's ref count is %d\n", linkedBase, linkedBase->ref); } } }
void *Context_GetExtra(const void *context, size_t contextSize) { - BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context, contextSize); + BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context);
assert(baseContext->type == ContextTypeLink); - return (LPBYTE)baseContext + sizeof(BASE_CONTEXT); + return (LPBYTE)CONTEXT_FROM_BASE_CONTEXT(baseContext) + contextSize; }
void *Context_GetLinkedContext(void *context, size_t contextSize) { - BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context, contextSize); + BASE_CONTEXT *baseContext = BASE_CONTEXT_FROM_CONTEXT(context);
assert(baseContext->type == ContextTypeLink); - return CONTEXT_FROM_BASE_CONTEXT(baseContext->u.linked, contextSize); + return CONTEXT_FROM_BASE_CONTEXT(baseContext->u.linked); }
CONTEXT_PROPERTY_LIST *Context_GetProperties(const void *context, size_t contextSize) { - BASE_CONTEXT *ptr = BASE_CONTEXT_FROM_CONTEXT(context, contextSize); + BASE_CONTEXT *ptr = BASE_CONTEXT_FROM_CONTEXT(context);
while (ptr && ptr->type == ContextTypeLink) ptr = ptr->u.linked; + return (ptr && ptr->type == ContextTypeData) ? ptr->u.properties : NULL; }
BOOL Context_Release(void *context, size_t contextSize, ContextFreeFunc dataContextFree) { - BASE_CONTEXT *base = BASE_CONTEXT_FROM_CONTEXT(context, contextSize); + BASE_CONTEXT *base = BASE_CONTEXT_FROM_CONTEXT(context); BOOL ret = TRUE;
if (base->ref <= 0) @@ -171,7 +158,7 @@ BOOL Context_Release(void *context, size_t contextSize, * it as well, using the same offset and data free function. */ ret = Context_Release(CONTEXT_FROM_BASE_CONTEXT( - base->u.linked, contextSize), contextSize, dataContextFree); + base->u.linked), contextSize, dataContextFree); } if (InterlockedDecrement(&base->ref) == 0) { @@ -181,7 +168,7 @@ BOOL Context_Release(void *context, size_t contextSize, ContextPropertyList_Free(base->u.properties); dataContextFree(context); } - CryptMemFree(context); + CryptMemFree(base); } else TRACE("%p's ref count is %d\n", context, base->ref); @@ -238,7 +225,7 @@ static inline struct list *ContextList_ContextToEntry(const struct ContextList * static inline void *ContextList_EntryToContext(const struct ContextList *list, struct list *entry) { - return (LPBYTE)entry - sizeof(BASE_CONTEXT) - list->contextSize; + return (LPBYTE)entry - list->contextSize; }
void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace) diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index 0fffa5b..5e60644 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -160,8 +160,9 @@ static BOOL CRYPT_MemAddCert(WINECRYPT_CERTSTORE *store, void *cert, if (context) { context->hCertStore = store; - if (ppStoreContext) + if (ppStoreContext) { *ppStoreContext = CertDuplicateCertificateContext(context); + } } return context != 0; }