Zebediah Figura : rpcrt4: Avoid clearing a NULL output parameter in client_do_args().
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 18:00:41 CDT 2018
Module: wine
Branch: master
Commit: 43275fb17824c947c1896d27098f294ab2e1930e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=43275fb17824c947c1896d27098f294ab2e1930e
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Thu Oct 11 11:59:19 2018 -0500
rpcrt4: Avoid clearing a NULL output parameter in client_do_args().
Avoids an unhandled exception. Passing NULL as a ref pointer (which a
top-level [out] parameter necessarily is) is illegal, but this will be caught
in the CALCSIZE pass. This matches midl/widl behaviour in the -Os case.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/rpcrt4/ndr_stubless.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index 18ce74d..6a65a14 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -422,6 +422,11 @@ static void client_free_handle(
}
}
+static inline BOOL param_needs_alloc( PARAM_ATTRIBUTES attr )
+{
+ return attr.IsOut && !attr.IsIn && !attr.IsBasetype && !attr.IsByValue;
+}
+
void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase,
void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal )
{
@@ -453,11 +458,8 @@ void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum s
switch (phase)
{
case STUBLESS_INITOUT:
- if (!params[i].attr.IsBasetype && params[i].attr.IsOut &&
- !params[i].attr.IsIn && !params[i].attr.IsByValue)
- {
+ if (param_needs_alloc(params[i].attr) && *(unsigned char **)pArg)
memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
- }
break;
case STUBLESS_CALCSIZE:
if (params[i].attr.IsSimpleRef && !*(unsigned char **)pArg)
@@ -1138,11 +1140,6 @@ LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, uns
}
#endif
-static inline BOOL param_needs_alloc( PARAM_ATTRIBUTES attr )
-{
- return attr.IsOut && !attr.IsIn && !attr.IsBasetype && !attr.IsByValue;
-}
-
static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
PFORMAT_STRING pFormat, enum stubless_phase phase,
unsigned short number_of_params)
More information about the wine-cvs
mailing list