Jacek Caban : ole32: Use proper allocators for storing source in ErrorInfoImpl.

Alexandre Julliard julliard at winehq.org
Thu Jul 19 13:23:44 CDT 2012


Module: wine
Branch: master
Commit: 4843f031f987ad4ac5bf21a64d90d3ffd5a0e8ca
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4843f031f987ad4ac5bf21a64d90d3ffd5a0e8ca

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul 19 11:49:09 2012 +0200

ole32: Use proper allocators for storing source in ErrorInfoImpl.

---

 dlls/ole32/errorinfo.c |   42 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/dlls/ole32/errorinfo.c b/dlls/ole32/errorinfo.c
index 055d6a5..8dbfff9 100644
--- a/dlls/ole32/errorinfo.c
+++ b/dlls/ole32/errorinfo.c
@@ -41,6 +41,32 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
+static inline void *heap_alloc(size_t len)
+{
+    return HeapAlloc(GetProcessHeap(), 0, len);
+}
+
+static inline BOOL heap_free(void *mem)
+{
+    return HeapFree(GetProcessHeap(), 0, mem);
+}
+
+static inline WCHAR *heap_strdupW(const WCHAR *str)
+{
+    WCHAR *ret = NULL;
+
+    if(str) {
+        size_t size;
+
+        size = (strlenW(str)+1)*sizeof(WCHAR);
+        ret = heap_alloc(size);
+        if(ret)
+            memcpy(ret, str, size);
+    }
+
+    return ret;
+}
+
 /* this code is from SysAllocStringLen (ole2disp.c in oleaut32) */
 static BSTR ERRORINFO_SysAllocString(const OLECHAR* in)
 {
@@ -129,7 +155,7 @@ typedef struct ErrorInfoImpl
     LONG ref;
 
     GUID m_Guid;
-    BSTR bstrSource;
+    WCHAR *source;
     BSTR bstrDescription;
     BSTR bstrHelpFile;
     DWORD m_dwHelpContext;
@@ -203,7 +229,7 @@ static ULONG WINAPI IErrorInfoImpl_Release(
 	{
 	  TRACE("-- destroying IErrorInfo(%p)\n",This);
 
-          ERRORINFO_SysFreeString(This->bstrSource);
+          heap_free(This->source);
           ERRORINFO_SysFreeString(This->bstrDescription);
           ERRORINFO_SysFreeString(This->bstrHelpFile);
 	  HeapFree(GetProcessHeap(),0,This);
@@ -231,7 +257,7 @@ static HRESULT WINAPI IErrorInfoImpl_GetSource(
 	TRACE("(%p)->(pBstrSource=%p)\n",This,pBstrSource);
 	if (pBstrSource == NULL)
 	    return E_INVALIDARG;
-	*pBstrSource = ERRORINFO_SysAllocString(This->bstrSource);
+	*pBstrSource = SysAllocString(This->source);
 	return S_OK;
 }
 
@@ -329,9 +355,9 @@ static HRESULT WINAPI ICreateErrorInfoImpl_SetSource(
 {
 	ErrorInfoImpl *This = impl_from_ICreateErrorInfo(iface);
 	TRACE("(%p): %s\n",This, debugstr_w(szSource));
-	if (This->bstrSource != NULL)
-	    ERRORINFO_SysFreeString(This->bstrSource);
-	This->bstrSource = ERRORINFO_SysAllocString(szSource);
+
+	heap_free(This->source);
+	This->source = heap_strdupW(szSource);
 
 	return S_OK;
 }
@@ -423,7 +449,7 @@ static const ISupportErrorInfoVtbl SupportErrorInfoVtbl =
 
 static IErrorInfo* IErrorInfoImpl_Constructor(void)
 {
-    ErrorInfoImpl *This = HeapAlloc(GetProcessHeap(), 0, sizeof(ErrorInfoImpl));
+    ErrorInfoImpl *This = heap_alloc(sizeof(ErrorInfoImpl));
 
     if (!This) return NULL;
 
@@ -431,7 +457,7 @@ static IErrorInfo* IErrorInfoImpl_Constructor(void)
     This->ICreateErrorInfo_iface.lpVtbl = &CreateErrorInfoVtbl;
     This->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl;
     This->ref = 1;
-    This->bstrSource = NULL;
+    This->source = NULL;
     This->bstrDescription = NULL;
     This->bstrHelpFile = NULL;
     This->m_dwHelpContext = 0;




More information about the wine-cvs mailing list