- Use I_RpcGetBuffer, instead of our own buffer routines to fix an

occasional test crash caused by heap corruption.
- Zero the memory block passed to RpcServerRegisterIfEx so we don't
  pass garbage in some of the fields we don't fill in.
- Return the correct error code from create_server and fix two handle
  leaks.
- TODO update.
This commit is contained in:
Robert Shearman 2005-02-15 21:48:09 +00:00 committed by Alexandre Julliard
parent dc16331c75
commit 2d2a39cc42
3 changed files with 23 additions and 20 deletions

View file

@ -30,9 +30,12 @@
*
* - Implement the service control manager (in rpcss) to keep track
* of registered class objects: ISCM::ServerRegisterClsid et al
* - Implement the OXID resolver so we don't need magic pipe names for
* - Implement the OXID resolver so we don't need magic endpoint names for
* clients and servers to meet up
*
* - Pump the message loop during RPC calls.
* - Call IMessageFilter functions.
*
* - Make all ole interface marshaling use NDR to be wire compatible with
* native DCOM
* - Use & interpret ORPCTHIS & ORPCTHAT.

View file

@ -190,10 +190,8 @@ CFStub_Invoke(
msg->cbBuffer = ststg.cbSize.u.LowPart;
if (msg->Buffer)
msg->Buffer = HeapReAlloc(GetProcessHeap(),0,msg->Buffer,ststg.cbSize.u.LowPart);
else
msg->Buffer = HeapAlloc(GetProcessHeap(),0,ststg.cbSize.u.LowPart);
I_RpcGetBuffer((RPC_MESSAGE *)msg);
if (hres) return hres;
seekto.u.LowPart = 0;seekto.u.HighPart = 0;
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
@ -546,10 +544,10 @@ static HRESULT WINAPI RemUnkStub_Invoke(LPRPCSTUBBUFFER iface,
/* out */
pMsg->cbBuffer = cIids * sizeof(REMQIRESULT);
if (pMsg->Buffer)
pMsg->Buffer = HeapReAlloc(GetProcessHeap(), 0, pMsg->Buffer, pMsg->cbBuffer);
else
pMsg->Buffer = HeapAlloc(GetProcessHeap(), 0, pMsg->cbBuffer);
I_RpcGetBuffer((RPC_MESSAGE *)pMsg);
if (hr) return hr;
buf = pMsg->Buffer;
/* FIXME: pQIResults is a unique pointer so pQIResults can be NULL! */
memcpy(buf, pQIResults, cIids * sizeof(REMQIRESULT));
@ -573,12 +571,13 @@ static HRESULT WINAPI RemUnkStub_Invoke(LPRPCSTUBBUFFER iface,
/* out */
pMsg->cbBuffer = cIids * sizeof(HRESULT);
if (pMsg->Buffer)
pMsg->Buffer = HeapReAlloc(GetProcessHeap(), 0, pMsg->Buffer, pMsg->cbBuffer);
else
pMsg->Buffer = HeapAlloc(GetProcessHeap(), 0, pMsg->cbBuffer);
buf = pMsg->Buffer;
memcpy(buf, pResults, cIids * sizeof(HRESULT));
I_RpcGetBuffer((RPC_MESSAGE *)pMsg);
if (!hr)
{
buf = pMsg->Buffer;
memcpy(buf, pResults, cIids * sizeof(HRESULT));
}
CoTaskMemFree(pResults);

View file

@ -410,7 +410,7 @@ HRESULT RPC_RegisterInterface(REFIID riid)
{
TRACE("Creating new interface\n");
rif = HeapAlloc(GetProcessHeap(), 0, sizeof(*rif));
rif = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*rif));
if (rif)
{
RPC_STATUS status;
@ -419,10 +419,9 @@ HRESULT RPC_RegisterInterface(REFIID riid)
rif->If.Length = sizeof(RPC_SERVER_INTERFACE);
/* RPC interface ID = COM interface ID */
rif->If.InterfaceId.SyntaxGUID = *riid;
/* COM objects always have a version of 0.0 */
rif->If.InterfaceId.SyntaxVersion.MajorVersion = 0;
rif->If.InterfaceId.SyntaxVersion.MinorVersion = 0;
rif->If.DispatchTable = &rpc_dispatch;
/* all other fields are 0, including the version asCOM objects
* always have a version of 0.0 */
status = RpcServerRegisterIfEx(
(RPC_IF_HANDLE)&rif->If,
NULL, NULL,
@ -539,8 +538,10 @@ static HRESULT create_server(REFCLSID rclsid)
if (!CreateProcessW(exe, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
WARN("failed to run local server %s\n", debugstr_w(exe));
return E_FAIL;
return HRESULT_FROM_WIN32(GetLastError());
}
CloseHandle(pinfo.hProcess);
CloseHandle(pinfo.hThread);
return S_OK;
}