Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
64eac75f
Commit
64eac75f
authored
Jan 27, 2005
by
Mike Hearn
Committed by
Alexandre Julliard
Jan 27, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Change some FIXMEs to ERRs to reflect the fact that nothing needs
fixing. - Fix some memory leaks on error paths in _marshal_interface.
parent
0cdfbd76
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
88 additions
and
50 deletions
+88
-50
tmarshal.c
dlls/oleaut32/tmarshal.c
+88
-50
No files found.
dlls/oleaut32/tmarshal.c
View file @
64eac75f
...
...
@@ -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
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment