ChangeSet ID: 21597 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/12/01 06:02:09
Modified files: dlls/oleaut32 : typelib.c
Log message: Robert Shearman rob@codeweavers.com Remove broken return value handling code and that would reference memory beyond the end of the arguments array. Replace it with code that properly handles referencing the return type and setting the return type to VT_VOID when a dispinterface function doesn't have any return value.
Patch: http://cvs.winehq.org/patch.py?id=21597
Old revision New revision Changes Path 1.182 1.183 +27 -32 wine/dlls/oleaut32/typelib.c
Index: wine/dlls/oleaut32/typelib.c diff -u -p wine/dlls/oleaut32/typelib.c:1.182 wine/dlls/oleaut32/typelib.c:1.183 --- wine/dlls/oleaut32/typelib.c:1.182 1 Dec 2005 12: 2: 9 -0000 +++ wine/dlls/oleaut32/typelib.c 1 Dec 2005 12: 2: 9 -0000 @@ -1861,43 +1861,38 @@ MSFT_DoFuncs(TLBContext* pcx, recoffset + reclength - ((pFuncRec->nrargs - j - 1) * sizeof(MSFT_ParameterInfo))); } + }
- /* parameter is the return value! */ - if ( paraminfo.Flags & PARAMFLAG_FRETVAL ) + /* special treatment for dispinterfaces: this makes functions appear + * to return their [retval] value when it is really returning an + * HRESULT */ + if ((pTI->TypeAttr.typekind == TKIND_DISPATCH) && + (*pptfd)->funcdesc.elemdescFunc.tdesc.vt == VT_HRESULT) + { + if (pFuncRec->nrargs && + ((*pptfd)->funcdesc.lprgelemdescParam[pFuncRec->nrargs - 1].u.paramdesc.wParamFlags & PARAMFLAG_FRETVAL)) { - TYPEDESC* lpArgTypeDesc; - - (*pptfd)->funcdesc.elemdescFunc = - (*pptfd)->funcdesc.lprgelemdescParam[j]; - - lpArgTypeDesc = & ((*pptfd)->funcdesc.elemdescFunc.tdesc) ; - - while ( lpArgTypeDesc != NULL ) + ELEMDESC *elemdesc = &(*pptfd)->funcdesc.lprgelemdescParam[pFuncRec->nrargs - 1]; + if (elemdesc->tdesc.vt != VT_PTR) { - switch ( lpArgTypeDesc->vt ) - { - case VT_PTR: - lpArgTypeDesc = lpArgTypeDesc->u.lptdesc; - break; - case VT_CARRAY: - lpArgTypeDesc = - & (lpArgTypeDesc->u.lpadesc->tdescElem); - - break; - - case VT_USERDEFINED: - MSFT_DoRefType(pcx, - pTI, - lpArgTypeDesc->u.hreftype); - - lpArgTypeDesc = NULL; - break; - - default: - lpArgTypeDesc = NULL; - } + ERR_(typelib)("elemdesc should have started with VT_PTR instead of:\n"); + if (ERR_ON(typelib)) + dump_ELEMDESC(elemdesc); + /* FIXME: return error */ + break; } + + (*pptfd)->funcdesc.elemdescFunc = *elemdesc; + + /* dereference parameter */ + (*pptfd)->funcdesc.elemdescFunc.tdesc = *elemdesc->tdesc.u.lptdesc; + + pFuncRec->nrargs--; + (*pptfd)->funcdesc.cParams = pFuncRec->nrargs; } + else + (*pptfd)->funcdesc.elemdescFunc.tdesc.vt = VT_VOID; + }
/* scode is not used: archaic win16 stuff FIXME: right? */