- Change some FIXMEs to ERRs to reflect the fact that nothing needs

fixing.
- Fix some memory leaks on error paths in _marshal_interface.
This commit is contained in:
Mike Hearn 2005-01-27 11:11:32 +00:00 committed by Alexandre Julliard
parent 0cdfbd7669
commit 64eac75fe4
1 changed files with 88 additions and 50 deletions

View File

@ -116,34 +116,50 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) {
DWORD xsize;
TRACE("...%s...\n",debugstr_guid(riid));
*pUnk = NULL;
hres = xbuf_get(buf,(LPBYTE)&xsize,sizeof(xsize));
if (hres) return hres;
if (hres) {
ERR("xbuf_get failed\n");
return hres;
}
if (xsize == 0) return S_OK;
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
if (hres) {
FIXME("Stream create failed %lx\n",hres);
ERR("Stream create failed %lx\n",hres);
return hres;
}
hres = IStream_Write(pStm,buf->base+buf->curoff,xsize,&res);
if (hres) { FIXME("stream write %lx\n",hres); return hres; }
if (hres) {
ERR("stream write %lx\n",hres);
return hres;
}
memset(&seekto,0,sizeof(seekto));
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
if (hres) { FIXME("Failed Seek %lx\n",hres); return hres;}
if (hres) {
ERR("Failed Seek %lx\n",hres);
return hres;
}
hres = CoUnmarshalInterface(pStm,riid,(LPVOID*)pUnk);
if (hres) {
FIXME("Unmarshalling interface %s failed with %lx\n",debugstr_guid(riid),hres);
ERR("Unmarshalling interface %s failed with %lx\n",debugstr_guid(riid),hres);
return hres;
}
IStream_Release(pStm);
return xbuf_skip(buf,xsize);
}
static HRESULT
_marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) {
LPUNKNOWN newiface;
LPBYTE tempbuf;
IStream *pStm;
LPUNKNOWN newiface = NULL;
LPBYTE tempbuf = NULL;
IStream *pStm = NULL;
STATSTG ststg;
ULARGE_INTEGER newpos;
LARGE_INTEGER seekto;
@ -151,45 +167,67 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) {
DWORD xsize;
HRESULT hres;
hres = S_OK;
if (!pUnk)
hres = E_FAIL;
if (!pUnk) {
ERR("pUnk is NULL?\n");
goto fail;
}
TRACE("...%s...\n",debugstr_guid(riid));
hres=IUnknown_QueryInterface(pUnk,riid,(LPVOID*)&newiface);
hres = IUnknown_QueryInterface(pUnk,riid,(LPVOID*)&newiface);
if (hres) {
TRACE("%p does not support iface %s\n",pUnk,debugstr_guid(riid));
WARN("%p does not support iface %s\n",pUnk,debugstr_guid(riid));
goto fail;
}
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
if (hres) {
FIXME("Stream create failed %lx\n",hres);
ERR("Stream create failed %lx\n",hres);
goto fail;
}
hres = CoMarshalInterface(pStm,riid,newiface,0,NULL,0);
IUnknown_Release(newiface);
if (hres) {
FIXME("Marshalling interface %s failed with %lx\n",
debugstr_guid(riid),hres
);
ERR("Marshalling interface %s failed with %lx\n", debugstr_guid(riid), hres);
goto fail;
}
hres = IStream_Stat(pStm,&ststg,0);
if (hres) {
ERR("Stream stat failed\n");
goto fail;
}
tempbuf = HeapAlloc(GetProcessHeap(), 0, ststg.cbSize.u.LowPart);
memset(&seekto,0,sizeof(seekto));
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
if (hres) { FIXME("Failed Seek %lx\n",hres); goto fail;}
if (hres) {
ERR("Failed Seek %lx\n",hres);
goto fail;
}
hres = IStream_Read(pStm,tempbuf,ststg.cbSize.u.LowPart,&res);
if (hres) { FIXME("Failed Read %lx\n",hres); goto fail;}
IStream_Release(pStm);
if (hres) {
ERR("Failed Read %lx\n",hres);
goto fail;
}
xsize = ststg.cbSize.u.LowPart;
xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize));
hres = xbuf_add(buf,tempbuf,ststg.cbSize.u.LowPart);
HeapFree(GetProcessHeap(),0,tempbuf);
IUnknown_Release(newiface);
IStream_Release(pStm);
return hres;
fail:
xsize = 0;
xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize));
if (pStm) IUnknown_Release(pStm);
if (newiface) IUnknown_Release(newiface);
HeapFree(GetProcessHeap(), 0, tempbuf);
return hres;
}
@ -225,20 +263,20 @@ _get_typeinfo_for_iid(REFIID riid, ITypeInfo**ti) {
);
if (RegOpenKeyA(HKEY_CLASSES_ROOT,interfacekey,&ikey)) {
FIXME("No %s key found.\n",interfacekey);
ERR("No %s key found.\n",interfacekey);
return E_FAIL;
}
type = (1<<REG_SZ);
tlguidlen = sizeof(tlguid);
if (RegQueryValueExA(ikey,NULL,NULL,&type,tlguid,&tlguidlen)) {
FIXME("Getting typelib guid failed.\n");
ERR("Getting typelib guid failed.\n");
RegCloseKey(ikey);
return E_FAIL;
}
type = (1<<REG_SZ);
verlen = sizeof(ver);
if (RegQueryValueExA(ikey,"Version",NULL,&type,ver,&verlen)) {
FIXME("Could not get version value?\n");
ERR("Could not get version value?\n");
RegCloseKey(ikey);
return E_FAIL;
}
@ -246,7 +284,7 @@ _get_typeinfo_for_iid(REFIID riid, ITypeInfo**ti) {
sprintf(typelibkey,"Typelib\\%s\\%s\\0\\win32",tlguid,ver);
tlfnlen = sizeof(tlfn);
if (RegQueryValueA(HKEY_CLASSES_ROOT,typelibkey,tlfn,&tlfnlen)) {
FIXME("Could not get typelib fn?\n");
ERR("Could not get typelib fn?\n");
return E_FAIL;
}
MultiByteToWideChar(CP_ACP, 0, tlfn, -1, tlfnW, -1);
@ -551,7 +589,7 @@ serialize_param(
hres = ITypeInfo_GetRefTypeInfo(tinfo,tdesc->u.hreftype,&tinfo2);
if (hres) {
FIXME("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.hreftype);
ERR("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.hreftype);
return hres;
}
ITypeInfo_GetTypeAttr(tinfo2,&tattr);
@ -571,7 +609,7 @@ serialize_param(
hres = ITypeInfo2_GetVarDesc(tinfo2, i, &vdesc);
if (hres) {
FIXME("Could not get vardesc of %d\n",i);
ERR("Could not get vardesc of %d\n",i);
return hres;
}
/* Need them for hack below */
@ -816,7 +854,7 @@ deserialize_param(
case VT_UI1:
if (readit) {
hres = xbuf_get(buf,(LPBYTE)arg,sizeof(DWORD));
if (hres) FIXME("Failed to read integer 4 byte\n");
if (hres) ERR("Failed to read integer 4 byte\n");
}
if (debugout) TRACE_(olerelay)("%lx",*arg);
return hres;
@ -827,7 +865,7 @@ deserialize_param(
if (readit) {
hres = xbuf_get(buf,(LPBYTE)&len,sizeof(DWORD));
if (hres) {
FIXME("failed to read bstr klen\n");
ERR("failed to read bstr klen\n");
return hres;
}
if (len == -1) {
@ -837,7 +875,7 @@ deserialize_param(
str = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len+sizeof(WCHAR));
hres = xbuf_get(buf,(LPBYTE)str,len);
if (hres) {
FIXME("Failed to read BSTR.\n");
ERR("Failed to read BSTR.\n");
return hres;
}
*arg = (DWORD)SysAllocStringLen(str,len);
@ -858,7 +896,7 @@ deserialize_param(
if (readit) {
hres = xbuf_get(buf,(LPBYTE)&cookie,sizeof(cookie));
if (hres) {
FIXME("Failed to load pointer cookie.\n");
ERR("Failed to load pointer cookie.\n");
return hres;
}
if (cookie != 0x42424242) {
@ -903,12 +941,12 @@ deserialize_param(
hres = ITypeInfo_GetRefTypeInfo(tinfo,tdesc->u.hreftype,&tinfo2);
if (hres) {
FIXME("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.hreftype);
ERR("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.hreftype);
return hres;
}
hres = ITypeInfo_GetTypeAttr(tinfo2,&tattr);
if (hres) {
FIXME("Could not get typeattr in VT_USERDEFINED.\n");
ERR("Could not get typeattr in VT_USERDEFINED.\n");
} else {
if (alloc)
*arg = (DWORD)HeapAlloc(GetProcessHeap(),0,tattr->cbSizeInstance);
@ -927,7 +965,7 @@ deserialize_param(
hres = ITypeInfo2_GetVarDesc(tinfo2, i, &vdesc);
if (hres) {
FIXME("Could not get vardesc of %d\n",i);
ERR("Could not get vardesc of %d\n",i);
return hres;
}
hres = deserialize_param(
@ -953,7 +991,7 @@ deserialize_param(
}
}
if (hres)
FIXME("failed to stuballoc in TKIND_RECORD.\n");
ERR("failed to stuballoc in TKIND_RECORD.\n");
ITypeInfo_Release(tinfo2);
return hres;
}
@ -1126,19 +1164,19 @@ _get_funcdesc(
hres = ITypeInfo_GetTypeAttr(tinfo, &attr);
if (hres) {
FIXME("GetTypeAttr failed with %lx\n",hres);
ERR("GetTypeAttr failed with %lx\n",hres);
return hres;
}
/* Not found, so look in inherited ifaces. */
for (j=0;j<attr->cImplTypes;j++) {
hres = ITypeInfo_GetRefTypeOfImplType(tinfo, j, &href);
if (hres) {
FIXME("Did not find a reftype for interface offset %d?\n",j);
ERR("Did not find a reftype for interface offset %d?\n",j);
break;
}
hres = ITypeInfo_GetRefTypeInfo(tinfo, href, &tinfo2);
if (hres) {
FIXME("Did not find a typeinfo for reftype %ld?\n",href);
ERR("Did not find a typeinfo for reftype %ld?\n",href);
continue;
}
hres = _get_funcdesc(tinfo2,iMethod,fdesc,iname,fname);
@ -1273,7 +1311,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
);
if (hres) {
FIXME("Failed to serialize param, hres %lx\n",hres);
ERR("Failed to serialize param, hres %lx\n",hres);
break;
}
xargs+=_argsize(elem->tdesc.vt);
@ -1285,7 +1323,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
msg.iMethod = method;
hres = IRpcChannelBuffer_GetBuffer(tpinfo->chanbuf,&msg,&(tpinfo->iid));
if (hres) {
FIXME("RpcChannelBuffer GetBuffer failed, %lx\n",hres);
ERR("RpcChannelBuffer GetBuffer failed, %lx\n",hres);
LeaveCriticalSection(&tpinfo->crit);
return hres;
}
@ -1293,7 +1331,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
if (relaydeb) TRACE_(olerelay)("\n");
hres = IRpcChannelBuffer_SendReceive(tpinfo->chanbuf,&msg,&status);
if (hres) {
FIXME("RpcChannelBuffer SendReceive failed, %lx\n",hres);
ERR("RpcChannelBuffer SendReceive failed, %lx\n",hres);
LeaveCriticalSection(&tpinfo->crit);
return hres;
}
@ -1343,7 +1381,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
&buf
);
if (hres) {
FIXME("Failed to deserialize DISPPARAM*, hres %lx\n",hres);
ERR("Failed to deserialize DISPPARAM*, hres %lx\n",hres);
break;
}
isdeserialized = TRUE;
@ -1373,7 +1411,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */)
&buf
);
if (hres) {
FIXME("Failed to unmarshall param, hres %lx\n",hres);
ERR("Failed to unmarshall param, hres %lx\n",hres);
status = hres;
break;
}
@ -1402,7 +1440,7 @@ PSFacBuf_CreateProxy(
TRACE("(...%s...)\n",debugstr_guid(riid));
hres = _get_typeinfo_for_iid(riid,&tinfo);
if (hres) {
FIXME("No typeinfo for %s?\n",debugstr_guid(riid));
ERR("No typeinfo for %s?\n",debugstr_guid(riid));
return hres;
}
nroffuncs = _nroffuncs(tinfo);
@ -1435,7 +1473,7 @@ PSFacBuf_CreateProxy(
int j;
hres = _get_funcdesc(tinfo,i,&fdesc,NULL,NULL);
if (hres) {
FIXME("GetFuncDesc %lx should not fail here.\n",hres);
ERR("GetFuncDesc %lx should not fail here.\n",hres);
return hres;
}
/* some args take more than 4 byte on the stack */
@ -1586,7 +1624,7 @@ TMStubImpl_Invoke(
}
hres = _get_funcdesc(This->tinfo,xmsg->iMethod,&fdesc,NULL,NULL);
if (hres) {
FIXME("GetFuncDesc on method %ld failed with %lx\n",xmsg->iMethod,hres);
ERR("GetFuncDesc on method %ld failed with %lx\n",xmsg->iMethod,hres);
return hres;
}
/* Need them for hack below */
@ -1627,7 +1665,7 @@ TMStubImpl_Invoke(
&buf
);
if (hres) {
FIXME("Failed to deserialize DISPPARAM*, hres %lx\n",hres);
ERR("Failed to deserialize DISPPARAM*, hres %lx\n",hres);
break;
}
isdeserialized = TRUE;
@ -1658,7 +1696,7 @@ TMStubImpl_Invoke(
);
xargs += _argsize(elem->tdesc.vt);
if (hres) {
FIXME("Failed to deserialize param %s, hres %lx\n",relaystr(names[i+1]),hres);
ERR("Failed to deserialize param %s, hres %lx\n",relaystr(names[i+1]),hres);
break;
}
}
@ -1725,7 +1763,7 @@ TMStubImpl_Invoke(
);
xargs += _argsize(elem->tdesc.vt);
if (hres) {
FIXME("Failed to stuballoc param, hres %lx\n",hres);
ERR("Failed to stuballoc param, hres %lx\n",hres);
break;
}
}
@ -1784,7 +1822,7 @@ PSFacBuf_CreateStub(
TRACE("(%s,%p,%p)\n",debugstr_guid(riid),pUnkServer,ppStub);
hres = _get_typeinfo_for_iid(riid,&tinfo);
if (hres) {
FIXME("No typeinfo for %s?\n",debugstr_guid(riid));
ERR("No typeinfo for %s?\n",debugstr_guid(riid));
return hres;
}
stub = CoTaskMemAlloc(sizeof(TMStubImpl));
@ -1798,7 +1836,7 @@ PSFacBuf_CreateStub(
*ppStub = (LPRPCSTUBBUFFER)stub;
TRACE("IRpcStubBuffer: %p\n", stub);
if (hres)
FIXME("Connect to pUnkServer failed?\n");
ERR("Connect to pUnkServer failed?\n");
return hres;
}