dispex: Check whether the server function changes the type of the arguments.
This commit is contained in:
parent
56e625b0da
commit
f1ebd2d894
|
@ -405,7 +405,6 @@ static void test_dispex(void)
|
||||||
/* change one of the argument vts */
|
/* change one of the argument vts */
|
||||||
i = 0xbeef;
|
i = 0xbeef;
|
||||||
hr = IDispatchEx_InvokeEx(dispex, 3, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
|
hr = IDispatchEx_InvokeEx(dispex, 3, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(hr == DISP_E_BADCALLEE, "got %08x\n", hr);
|
ok(hr == DISP_E_BADCALLEE, "got %08x\n", hr);
|
||||||
|
|
||||||
hr = IDispatchEx_InvokeEx(dispex, 4, LOCALE_SYSTEM_DEFAULT, 0xffff, ¶ms, NULL, NULL, NULL);
|
hr = IDispatchEx_InvokeEx(dispex, 4, LOCALE_SYSTEM_DEFAULT, 0xffff, ¶ms, NULL, NULL, NULL);
|
||||||
|
|
|
@ -118,6 +118,7 @@ HRESULT __RPC_STUB IDispatchEx_InvokeEx_Stub(IDispatchEx* This, DISPID id, LCID
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
UINT arg;
|
UINT arg;
|
||||||
|
VARTYPE *vt_list = NULL;
|
||||||
|
|
||||||
TRACE("(%p)->(%08x, %04x, %08x, %p, %p, %p, %p, %d, %p, %p)\n", This, id, lcid, dwFlags,
|
TRACE("(%p)->(%08x, %04x, %08x, %p, %p, %p, %p, %d, %p, %p)\n", This, id, lcid, dwFlags,
|
||||||
pdp, result, pei, pspCaller, byref_args, ref_idx, ref_arg);
|
pdp, result, pei, pspCaller, byref_args, ref_idx, ref_arg);
|
||||||
|
@ -131,8 +132,30 @@ HRESULT __RPC_STUB IDispatchEx_InvokeEx_Stub(IDispatchEx* This, DISPID id, LCID
|
||||||
if(dwFlags & NULL_RESULT) result = NULL;
|
if(dwFlags & NULL_RESULT) result = NULL;
|
||||||
if(dwFlags & NULL_EXCEPINFO) pei = NULL;
|
if(dwFlags & NULL_EXCEPINFO) pei = NULL;
|
||||||
|
|
||||||
|
/* Create an array of the original VTs to check that the function doesn't change
|
||||||
|
any on return. */
|
||||||
|
if(byref_args)
|
||||||
|
{
|
||||||
|
vt_list = HeapAlloc(GetProcessHeap(), 0, pdp->cArgs * sizeof(vt_list[0]));
|
||||||
|
if(!vt_list) return E_OUTOFMEMORY;
|
||||||
|
for(arg = 0; arg < pdp->cArgs; arg++)
|
||||||
|
vt_list[arg] = V_VT(pdp->rgvarg + arg);
|
||||||
|
}
|
||||||
|
|
||||||
hr = IDispatchEx_InvokeEx(This, id, lcid, dwFlags & 0xffff, pdp, result, pei, pspCaller);
|
hr = IDispatchEx_InvokeEx(This, id, lcid, dwFlags & 0xffff, pdp, result, pei, pspCaller);
|
||||||
|
|
||||||
|
if(SUCCEEDED(hr) && byref_args)
|
||||||
|
{
|
||||||
|
for(arg = 0; arg < pdp->cArgs; arg++)
|
||||||
|
{
|
||||||
|
if(vt_list[arg] != V_VT(pdp->rgvarg + arg))
|
||||||
|
{
|
||||||
|
hr = DISP_E_BADCALLEE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(hr == DISP_E_EXCEPTION)
|
if(hr == DISP_E_EXCEPTION)
|
||||||
{
|
{
|
||||||
if(pei && pei->pfnDeferredFillIn)
|
if(pei && pei->pfnDeferredFillIn)
|
||||||
|
@ -145,5 +168,6 @@ HRESULT __RPC_STUB IDispatchEx_InvokeEx_Stub(IDispatchEx* This, DISPID id, LCID
|
||||||
for(arg = 0; arg < byref_args; arg++)
|
for(arg = 0; arg < byref_args; arg++)
|
||||||
VariantInit(pdp->rgvarg + ref_idx[arg]);
|
VariantInit(pdp->rgvarg + ref_idx[arg]);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, vt_list);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue