[PATCH 3/3] oleaut32: Don't return bogus pointers if no data is available
Andrew Eikum
aeikum at codeweavers.com
Fri May 10 14:31:35 CDT 2013
---
dlls/oleaut32/typelib.c | 44 +++++++++++++++++++++++++-------------------
1 file changed, 25 insertions(+), 19 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index b0a18b9..bb9eaf4 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5330,9 +5330,12 @@ static HRESULT TLB_AllocAndInitFuncDesc( const FUNCDESC *src, FUNCDESC **dest_pt
dest->funckind = FUNC_DISPATCH;
buffer = (char *)(dest + 1);
- dest->lprgscode = (SCODE *)buffer;
- memcpy(dest->lprgscode, src->lprgscode, sizeof(*src->lprgscode) * src->cScodes);
- buffer += sizeof(*src->lprgscode) * src->cScodes;
+ if (dest->cScodes) {
+ dest->lprgscode = (SCODE *)buffer;
+ memcpy(dest->lprgscode, src->lprgscode, sizeof(*src->lprgscode) * src->cScodes);
+ buffer += sizeof(*src->lprgscode) * src->cScodes;
+ } else
+ dest->lprgscode = NULL;
hr = TLB_CopyElemDesc(&src->elemdescFunc, &dest->elemdescFunc, &buffer);
if (FAILED(hr))
@@ -5341,23 +5344,26 @@ static HRESULT TLB_AllocAndInitFuncDesc( const FUNCDESC *src, FUNCDESC **dest_pt
return hr;
}
- dest->lprgelemdescParam = (ELEMDESC *)buffer;
- buffer += sizeof(ELEMDESC) * src->cParams;
- for (i = 0; i < src->cParams; i++)
- {
- hr = TLB_CopyElemDesc(&src->lprgelemdescParam[i], &dest->lprgelemdescParam[i], &buffer);
+ if (dest->cParams) {
+ dest->lprgelemdescParam = (ELEMDESC *)buffer;
+ buffer += sizeof(ELEMDESC) * src->cParams;
+ for (i = 0; i < src->cParams; i++)
+ {
+ hr = TLB_CopyElemDesc(&src->lprgelemdescParam[i], &dest->lprgelemdescParam[i], &buffer);
+ if (FAILED(hr))
+ break;
+ }
if (FAILED(hr))
- break;
- }
- if (FAILED(hr))
- {
- /* undo the above actions */
- for (i = i - 1; i >= 0; i--)
- TLB_FreeElemDesc(&dest->lprgelemdescParam[i]);
- TLB_FreeElemDesc(&dest->elemdescFunc);
- SysFreeString((BSTR)dest);
- return hr;
- }
+ {
+ /* undo the above actions */
+ for (i = i - 1; i >= 0; i--)
+ TLB_FreeElemDesc(&dest->lprgelemdescParam[i]);
+ TLB_FreeElemDesc(&dest->elemdescFunc);
+ SysFreeString((BSTR)dest);
+ return hr;
+ }
+ } else
+ dest->lprgelemdescParam = NULL;
/* special treatment for dispinterfaces: this makes functions appear
* to return their [retval] value when it is really returning an
--
1.8.2.2
More information about the wine-patches
mailing list