Module: wine Branch: master Commit: 2217e42c9d351a250fb27550d2262218721ebac1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2217e42c9d351a250fb27550d2...
Author: Jacek Caban jacek@codeweavers.com Date: Wed May 2 16:25:11 2012 +0200
oleaut32: Added warn+heap support for cached BSTRs.
---
dlls/oleaut32/oleaut.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/oleaut.c b/dlls/oleaut32/oleaut.c index b84fdc4..97d1b96 100644 --- a/dlls/oleaut32/oleaut.c +++ b/dlls/oleaut32/oleaut.c @@ -41,6 +41,7 @@ #include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole); +WINE_DECLARE_DEBUG_CHANNEL(heap);
/****************************************************************************** * BSTR {OLEAUT32} @@ -97,6 +98,10 @@ typedef struct {
#define BUCKET_SIZE 16
+#define ARENA_INUSE_FILLER 0x55 +#define ARENA_TAIL_FILLER 0xab +#define ARENA_FREE_FILLER 0xfeeefeee + static bstr_cache_entry_t bstr_cache[0x10000/BUCKET_SIZE];
static inline size_t bstr_alloc_size(size_t size) @@ -140,6 +145,14 @@ static bstr_t *alloc_bstr(size_t size) LeaveCriticalSection(&cs_bstr_cache);
if(cache_entry) { + if(WARN_ON(heap)) { + size_t tail; + + memset(ret, ARENA_INUSE_FILLER, FIELD_OFFSET(bstr_t, u.ptr[size+sizeof(WCHAR)])); + tail = bstr_alloc_size(size) - FIELD_OFFSET(bstr_t, u.ptr[size+sizeof(WCHAR)]); + if(tail) + memset(ret->u.ptr+size+sizeof(WCHAR), ARENA_TAIL_FILLER, tail); + } ret->size = size; return ret; } @@ -250,6 +263,13 @@ void WINAPI SysFreeString(BSTR str) cache_entry->buf[(cache_entry->head+cache_entry->cnt)%((sizeof(cache_entry->buf)/sizeof(*cache_entry->buf)))] = bstr; cache_entry->cnt++;
+ if(WARN_ON(heap)) { + unsigned i, n = bstr_alloc_size(bstr->size) / sizeof(DWORD) - 1; + bstr->size = ARENA_FREE_FILLER; + for(i=0; i<n; i++) + bstr->u.dwptr[i] = ARENA_FREE_FILLER; + } + LeaveCriticalSection(&cs_bstr_cache); return; }