From b14357b82cc036835990ffb1da173992cb0ec866 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sun, 9 Aug 2009 14:28:07 +0000 Subject: [PATCH] partial rpcrt4 sync to wine 1.1.27 (fixes ~180 rpcrt4 winetests) svn path=/trunk/; revision=42564 --- reactos/dll/win32/rpcrt4/ndr_es.c | 4 +- reactos/dll/win32/rpcrt4/ndr_marshall.c | 240 ++++++++++++++---------- 2 files changed, 144 insertions(+), 100 deletions(-) diff --git a/reactos/dll/win32/rpcrt4/ndr_es.c b/reactos/dll/win32/rpcrt4/ndr_es.c index b0bb7cc5f40..dc50ad8b025 100644 --- a/reactos/dll/win32/rpcrt4/ndr_es.c +++ b/reactos/dll/win32/rpcrt4/ndr_es.c @@ -105,7 +105,7 @@ RPC_STATUS WINAPI MesIncrementalHandleReset( handle_t Handle, void *UserState, MIDL_ES_ALLOC AllocFn, MIDL_ES_WRITE WriteFn, MIDL_ES_READ ReadFn, MIDL_ES_CODE Operation) { - MIDL_ES_MESSAGE *pEsMsg = (MIDL_ES_MESSAGE *)Handle; + MIDL_ES_MESSAGE *pEsMsg = Handle; TRACE("(%p, %p, %p, %p, %p, %d)\n", Handle, UserState, AllocFn, WriteFn, ReadFn, Operation); @@ -324,7 +324,7 @@ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStu { /* pointer to start of stack where arguments start */ RPC_MESSAGE rpcMsg; - MIDL_ES_MESSAGE *pEsMsg = (MIDL_ES_MESSAGE *)Handle; + MIDL_ES_MESSAGE *pEsMsg = Handle; /* size of stack */ unsigned short stack_size; /* header for procedure string */ diff --git a/reactos/dll/win32/rpcrt4/ndr_marshall.c b/reactos/dll/win32/rpcrt4/ndr_marshall.c index e0ff73d9dd4..1777c49cc60 100644 --- a/reactos/dll/win32/rpcrt4/ndr_marshall.c +++ b/reactos/dll/win32/rpcrt4/ndr_marshall.c @@ -102,9 +102,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); } while(0) #define STD_OVERFLOW_CHECK(_Msg) do { \ - TRACE("buffer=%d/%d\n", _Msg->Buffer - (unsigned char *)_Msg->RpcMsg->Buffer, _Msg->BufferLength); \ + TRACE("buffer=%d/%d\n", (ULONG)(_Msg->Buffer - (unsigned char *)_Msg->RpcMsg->Buffer), _Msg->BufferLength); \ if (_Msg->Buffer > (unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength) \ - ERR("buffer overflow %d bytes\n", _Msg->Buffer - ((unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength)); \ + ERR("buffer overflow %d bytes\n", (ULONG)(_Msg->Buffer - ((unsigned char *)_Msg->RpcMsg->Buffer + _Msg->BufferLength))); \ } while (0) #define NDR_POINTER_ID_BASE 0x20000 @@ -998,9 +998,8 @@ static void PointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, /*********************************************************************** * PointerMemorySize [internal] */ -static unsigned long PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, - unsigned char *Buffer, - PFORMAT_STRING pFormat) +static ULONG PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + unsigned char *Buffer, PFORMAT_STRING pFormat) { unsigned type = pFormat[0], attr = pFormat[1]; PFORMAT_STRING desc; @@ -1043,6 +1042,8 @@ static unsigned long PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, } if (attr & RPC_FC_P_DEREF) { + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void*)); + pStubMsg->MemorySize += sizeof(void*); TRACE("deref\n"); } @@ -1339,8 +1340,8 @@ static void EmbeddedPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, /*********************************************************************** * EmbeddedPointerMemorySize [internal] */ -static unsigned long EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, - PFORMAT_STRING pFormat) +static ULONG EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) { unsigned char *Mark = pStubMsg->BufferMark; unsigned rep, count, stride; @@ -1500,18 +1501,28 @@ unsigned char * WINAPI NdrPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); - /* Increment the buffer here instead of in PointerUnmarshall, - * as that is used by embedded pointers which already handle the incrementing - * the buffer, and shouldn't read any additional pointer data from the - * buffer */ - if (*pFormat != RPC_FC_RP) + if (*pFormat == RPC_FC_RP) { + Buffer = pStubMsg->Buffer; + /* Do the NULL ref pointer check here because embedded pointers can be + * NULL if the type the pointer is embedded in was allocated rather than + * being passed in by the client */ + if (pStubMsg->IsClient && !*ppMemory) + { + ERR("NULL ref pointer is not allowed\n"); + RpcRaiseException(RPC_X_NULL_REF_POINTER); + } + } + else + { + /* Increment the buffer here instead of in PointerUnmarshall, + * as that is used by embedded pointers which already handle the incrementing + * the buffer, and shouldn't read any additional pointer data from the + * buffer */ ALIGN_POINTER(pStubMsg->Buffer, 4); Buffer = pStubMsg->Buffer; safe_buffer_increment(pStubMsg, 4); } - else - Buffer = pStubMsg->Buffer; PointerUnmarshall(pStubMsg, Buffer, ppMemory, *ppMemory, pFormat, fMustAlloc); @@ -1545,10 +1556,14 @@ void WINAPI NdrPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, ULONG WINAPI NdrPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat) { - /* unsigned size = *(LPWORD)(pFormat+2); */ - FIXME("(%p,%p): stub\n", pStubMsg, pFormat); - PointerMemorySize(pStubMsg, pStubMsg->Buffer, pFormat); - return 0; + unsigned char *Buffer = pStubMsg->Buffer; + if (*pFormat != RPC_FC_RP) + { + ALIGN_POINTER(pStubMsg->Buffer, 4); + safe_buffer_increment(pStubMsg, 4); + } + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *)); + return PointerMemorySize(pStubMsg, Buffer, pFormat); } /*********************************************************************** @@ -2559,8 +2574,8 @@ typedef struct } NDR_RANGE; #include "poppack.h" -static unsigned long EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg, - PFORMAT_STRING pFormat) +static ULONG EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg, + PFORMAT_STRING pFormat) { switch (*pFormat) { case RPC_FC_STRUCT: @@ -2621,8 +2636,8 @@ static unsigned long EmbeddedComplexSize(MIDL_STUB_MESSAGE *pStubMsg, } -static unsigned long EmbeddedComplexMemorySize(PMIDL_STUB_MESSAGE pStubMsg, - PFORMAT_STRING pFormat) +static ULONG EmbeddedComplexMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat) { NDR_MEMORYSIZE m = NdrMemorySizer[*pFormat & NDR_TABLE_MASK]; @@ -2643,7 +2658,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg, { PFORMAT_STRING desc; NDR_MARSHALL m; - unsigned long size; + ULONG size; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -2709,7 +2724,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg, } TRACE("pStubMsg->Buffer after %p\n", pStubMsg->Buffer); pPointer += 4; - pMemory += 4; + pMemory += sizeof(void *); break; } case RPC_FC_ALIGNM4: @@ -2732,7 +2747,7 @@ static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg, pFormat += 2; desc = pFormat + *(const SHORT*)pFormat; size = EmbeddedComplexSize(pStubMsg, desc); - TRACE("embedded complex (size=%ld) <= %p\n", size, pMemory); + TRACE("embedded complex (size=%d) <= %p\n", size, pMemory); m = NdrMarshaller[*desc & NDR_TABLE_MASK]; if (m) { @@ -2768,7 +2783,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, { PFORMAT_STRING desc; NDR_UNMARSHALL m; - unsigned long size; + ULONG size; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -2834,7 +2849,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, safe_buffer_increment(pStubMsg, 4); /* for pointer ID */ } pPointer += 4; - pMemory += 4; + pMemory += sizeof(void *); break; } case RPC_FC_ALIGNM4: @@ -2858,7 +2873,7 @@ static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, pFormat += 2; desc = pFormat + *(const SHORT*)pFormat; size = EmbeddedComplexSize(pStubMsg, desc); - TRACE("embedded complex (size=%ld) => %p\n", size, pMemory); + TRACE("embedded complex (size=%d) => %p\n", size, pMemory); if (fMustAlloc) /* we can't pass fMustAlloc=TRUE into the marshaller for this type * since the type is part of the memory block that is encompassed by @@ -2900,7 +2915,7 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg, { PFORMAT_STRING desc; NDR_BUFFERSIZE m; - unsigned long size; + ULONG size; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -2949,7 +2964,7 @@ static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg, safe_buffer_length_increment(pStubMsg, 4); } pPointer += 4; - pMemory += 4; + pMemory += sizeof(void*); break; case RPC_FC_ALIGNM4: ALIGN_POINTER(pMemory, 4); @@ -3005,7 +3020,7 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg, { PFORMAT_STRING desc; NDR_FREE m; - unsigned long size; + ULONG size; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -3032,7 +3047,7 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg, case RPC_FC_POINTER: NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer); pPointer += 4; - pMemory += 4; + pMemory += sizeof(void *); break; case RPC_FC_ALIGNM4: ALIGN_POINTER(pMemory, 4); @@ -3080,12 +3095,12 @@ static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg, return pMemory; } -static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, - PFORMAT_STRING pFormat, - PFORMAT_STRING pPointer) +static ULONG ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, + PFORMAT_STRING pFormat, + PFORMAT_STRING pPointer) { PFORMAT_STRING desc; - unsigned long size = 0; + ULONG size = 0; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -3143,7 +3158,7 @@ static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, safe_buffer_increment(pStubMsg, 4); /* for pointer ID */ } pPointer += 4; - size += 4; + size += sizeof(void *); break; } case RPC_FC_ALIGNM4: @@ -3179,11 +3194,10 @@ static unsigned long ComplexStructMemorySize(PMIDL_STUB_MESSAGE pStubMsg, return size; } -unsigned long ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, - PFORMAT_STRING pFormat) +ULONG ComplexStructSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat) { PFORMAT_STRING desc; - unsigned long size = 0; + ULONG size = 0; while (*pFormat != RPC_FC_END) { switch (*pFormat) { @@ -3264,18 +3278,18 @@ unsigned char * WINAPI NdrComplexStructMarshall(PMIDL_STUB_MESSAGE pStubMsg, { int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers; /* save buffer length */ - unsigned long saved_buffer_length = pStubMsg->BufferLength; + ULONG saved_buffer_length = pStubMsg->BufferLength; /* get the buffer pointer after complex array data, but before * pointer data */ - pStubMsg->BufferLength = pStubMsg->Buffer - pStubMsg->BufferStart; + pStubMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer; pStubMsg->IgnoreEmbeddedPointers = 1; NdrComplexStructBufferSize(pStubMsg, pMemory, pFormat); pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded; /* save it for use by embedded pointer code later */ - pStubMsg->PointerBufferMark = pStubMsg->BufferStart + pStubMsg->BufferLength; - TRACE("difference = 0x%x\n", pStubMsg->PointerBufferMark - pStubMsg->Buffer); + pStubMsg->PointerBufferMark = (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength; + TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->PointerBufferMark - pStubMsg->Buffer)); pointer_buffer_mark_set = 1; /* restore the original buffer length */ @@ -3294,7 +3308,7 @@ unsigned char * WINAPI NdrComplexStructMarshall(PMIDL_STUB_MESSAGE pStubMsg, if (conf_array) { - unsigned long struct_size = ComplexStructSize(pStubMsg, pFormat); + ULONG struct_size = ComplexStructSize(pStubMsg, pFormat); array_compute_and_write_conformance(conf_array[0], pStubMsg, pMemory + struct_size, conf_array); /* these could be changed in ComplexMarshall so save them for later */ @@ -3361,7 +3375,7 @@ unsigned char * WINAPI NdrComplexStructUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, /* save it for use by embedded pointer code later */ pStubMsg->PointerBufferMark = pStubMsg->Buffer; - TRACE("difference = 0x%lx\n", (unsigned long)(pStubMsg->PointerBufferMark - saved_buffer)); + TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->PointerBufferMark - saved_buffer)); pointer_buffer_mark_set = 1; /* restore the original buffer */ @@ -3438,7 +3452,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg, if(!pStubMsg->IgnoreEmbeddedPointers && !pStubMsg->PointerLength) { int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers; - unsigned long saved_buffer_length = pStubMsg->BufferLength; + ULONG saved_buffer_length = pStubMsg->BufferLength; /* get the buffer length after complex struct data, but before * pointer data */ @@ -3449,7 +3463,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg, /* save it for use by embedded pointer code later */ pStubMsg->PointerLength = pStubMsg->BufferLength; pointer_length_set = 1; - TRACE("difference = 0x%lx\n", pStubMsg->PointerLength - saved_buffer_length); + TRACE("difference = 0x%x\n", pStubMsg->PointerLength - saved_buffer_length); /* restore the original buffer length */ pStubMsg->BufferLength = saved_buffer_length; @@ -3465,7 +3479,7 @@ void WINAPI NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg, if (conf_array) { - unsigned long struct_size = ComplexStructSize(pStubMsg, pFormat); + ULONG struct_size = ComplexStructSize(pStubMsg, pFormat); array_compute_and_size_conformance(conf_array[0], pStubMsg, pMemory + struct_size, conf_array); @@ -3823,21 +3837,21 @@ unsigned char * WINAPI NdrComplexArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg, /* save buffer fields that may be changed by buffer sizer functions * and that may be needed later on */ int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers; - unsigned long saved_buffer_length = pStubMsg->BufferLength; - unsigned long saved_max_count = pStubMsg->MaxCount; - unsigned long saved_offset = pStubMsg->Offset; - unsigned long saved_actual_count = pStubMsg->ActualCount; + ULONG saved_buffer_length = pStubMsg->BufferLength; + ULONG_PTR saved_max_count = pStubMsg->MaxCount; + ULONG saved_offset = pStubMsg->Offset; + ULONG saved_actual_count = pStubMsg->ActualCount; /* get the buffer pointer after complex array data, but before * pointer data */ - pStubMsg->BufferLength = pStubMsg->Buffer - pStubMsg->BufferStart; + pStubMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer; pStubMsg->IgnoreEmbeddedPointers = 1; NdrComplexArrayBufferSize(pStubMsg, pMemory, pFormat); pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded; /* save it for use by embedded pointer code later */ - pStubMsg->PointerBufferMark = pStubMsg->BufferStart + pStubMsg->BufferLength; - TRACE("difference = 0x%x\n", pStubMsg->Buffer - pStubMsg->BufferStart); + pStubMsg->PointerBufferMark = (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength; + TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer)); pointer_buffer_mark_set = 1; /* restore fields */ @@ -3915,7 +3929,7 @@ unsigned char * WINAPI NdrComplexArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, size = pStubMsg->MemorySize; pStubMsg->IgnoreEmbeddedPointers = saved_ignore_embedded; - TRACE("difference = 0x%lx\n", (unsigned long)(pStubMsg->Buffer - saved_buffer)); + TRACE("difference = 0x%x\n", (ULONG)(pStubMsg->Buffer - saved_buffer)); if (!pStubMsg->PointerBufferMark) { /* save it for use by embedded pointer code later */ @@ -3979,10 +3993,10 @@ void WINAPI NdrComplexArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg, /* save buffer fields that may be changed by buffer sizer functions * and that may be needed later on */ int saved_ignore_embedded = pStubMsg->IgnoreEmbeddedPointers; - unsigned long saved_buffer_length = pStubMsg->BufferLength; - unsigned long saved_max_count = pStubMsg->MaxCount; - unsigned long saved_offset = pStubMsg->Offset; - unsigned long saved_actual_count = pStubMsg->ActualCount; + ULONG saved_buffer_length = pStubMsg->BufferLength; + ULONG_PTR saved_max_count = pStubMsg->MaxCount; + ULONG saved_offset = pStubMsg->Offset; + ULONG saved_actual_count = pStubMsg->ActualCount; /* get the buffer pointer after complex array data, but before * pointer data */ @@ -4237,7 +4251,7 @@ void WINAPI NdrUserMarshalBufferSize(PMIDL_STUB_MESSAGE pStubMsg, unsigned index = *(const WORD*)&pFormat[2]; DWORD bufsize = *(const WORD*)&pFormat[6]; USER_MARSHAL_CB umcb; - unsigned long saved_buffer_length = 0; + ULONG saved_buffer_length = 0; TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); TRACE("index=%d\n", index); @@ -4891,7 +4905,7 @@ typedef struct { unsigned char type; unsigned char alignment; - unsigned long total_size; + ULONG total_size; } NDR_LGFARRAY_FORMAT; #include "poppack.h" @@ -4903,7 +4917,7 @@ unsigned char * WINAPI NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat) { const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat; - unsigned long total_size; + ULONG total_size; TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat); @@ -4946,7 +4960,7 @@ unsigned char * WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, unsigned char fMustAlloc) { const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat; - unsigned long total_size; + ULONG total_size; unsigned char *saved_buffer; TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); @@ -5001,7 +5015,7 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat) { const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat; - unsigned long total_size; + ULONG total_size; TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat); @@ -5413,7 +5427,7 @@ static ULONG get_discriminant(unsigned char fc, const unsigned char *pMemory) } static PFORMAT_STRING get_arm_offset_from_union_arm_selector(PMIDL_STUB_MESSAGE pStubMsg, - unsigned long discriminant, + ULONG discriminant, PFORMAT_STRING pFormat) { unsigned short num_arms, arm, type; @@ -5436,13 +5450,13 @@ static PFORMAT_STRING get_arm_offset_from_union_arm_selector(PMIDL_STUB_MESSAGE { if(type == 0xffff) { - ERR("no arm for 0x%lx and no default case\n", discriminant); + ERR("no arm for 0x%x and no default case\n", discriminant); RpcRaiseException(RPC_S_INVALID_TAG); return NULL; } if(type == 0) { - TRACE("falling back to empty default case for 0x%lx\n", discriminant); + TRACE("falling back to empty default case for 0x%x\n", discriminant); return NULL; } } @@ -5547,7 +5561,6 @@ static unsigned char *union_arm_unmarshall(PMIDL_STUB_MESSAGE pStubMsg, case RPC_FC_UP: case RPC_FC_OP: case RPC_FC_FP: - **(void***)ppMemory = NULL; ALIGN_POINTER(pStubMsg->Buffer, 4); saved_buffer = pStubMsg->Buffer; if (pStubMsg->PointerBufferMark) @@ -5671,8 +5684,8 @@ static ULONG union_arm_memory_size(PMIDL_STUB_MESSAGE pStubMsg, ALIGN_POINTER(pStubMsg->Buffer, 4); saved_buffer = pStubMsg->Buffer; safe_buffer_increment(pStubMsg, 4); - ALIGN_LENGTH(pStubMsg->MemorySize, 4); - pStubMsg->MemorySize += 4; + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *)); + pStubMsg->MemorySize += sizeof(void *); if (!pStubMsg->IgnoreEmbeddedPointers) PointerMemorySize(pStubMsg, saved_buffer, pFormat); break; @@ -5782,10 +5795,18 @@ unsigned char * WINAPI NdrEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pStubM if (fMustAlloc) *ppMemory = NdrAllocate(pStubMsg, size); + /* we can't pass fMustAlloc=TRUE into the marshaller for the arm + * since the arm is part of the memory block that is encompassed by + * the whole union. Memory is forced to allocate when pointers + * are set to NULL, so we emulate that part of fMustAlloc=TRUE by + * clearing the memory we pass in to the unmarshaller */ + if (fMustAlloc) + memset(*ppMemory, 0, size); + NdrBaseTypeUnmarshall(pStubMsg, ppMemory, &switch_type, FALSE); pMemoryArm = *ppMemory + increment; - return union_arm_unmarshall(pStubMsg, &pMemoryArm, switch_value, pFormat, fMustAlloc); + return union_arm_unmarshall(pStubMsg, &pMemoryArm, switch_value, pFormat, FALSE); } /*********************************************************************** @@ -5889,10 +5910,10 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionMarshall(PMIDL_STUB_MESSAGE pStub return union_arm_marshall(pStubMsg, pMemory, pStubMsg->MaxCount, pFormat + *(const SHORT*)pFormat); } -static long unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg, +static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING *ppFormat) { - long discriminant = 0; + LONG discriminant = 0; switch(**ppFormat) { @@ -5945,7 +5966,7 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt PFORMAT_STRING pFormat, unsigned char fMustAlloc) { - long discriminant; + LONG discriminant; unsigned short size; TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); @@ -5953,7 +5974,7 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt /* Unmarshall discriminant */ discriminant = unmarshall_discriminant(pStubMsg, &pFormat); - TRACE("unmarshalled discriminant %lx\n", discriminant); + TRACE("unmarshalled discriminant %x\n", discriminant); pFormat += *(const SHORT*)pFormat; @@ -5964,7 +5985,15 @@ unsigned char * WINAPI NdrNonEncapsulatedUnionUnmarshall(PMIDL_STUB_MESSAGE pSt if (fMustAlloc) *ppMemory = NdrAllocate(pStubMsg, size); - return union_arm_unmarshall(pStubMsg, ppMemory, discriminant, pFormat, fMustAlloc); + /* we can't pass fMustAlloc=TRUE into the marshaller for the arm + * since the arm is part of the memory block that is encompassed by + * the whole union. Memory is forced to allocate when pointers + * are set to NULL, so we emulate that part of fMustAlloc=TRUE by + * clearing the memory we pass in to the unmarshaller */ + if (fMustAlloc) + memset(*ppMemory, 0, size); + + return union_arm_unmarshall(pStubMsg, ppMemory, discriminant, pFormat, FALSE); } /*********************************************************************** @@ -6179,68 +6208,68 @@ unsigned char *WINAPI NdrRangeUnmarshall( TRACE("base_type = 0x%02x, low_value = %d, high_value = %d\n", base_type, pRange->low_value, pRange->high_value); -#define RANGE_UNMARSHALL(type, format_spec) \ +#define RANGE_UNMARSHALL(mem_type, wire_type, format_spec) \ do \ { \ - ALIGN_POINTER(pStubMsg->Buffer, sizeof(type)); \ + ALIGN_POINTER(pStubMsg->Buffer, sizeof(wire_type)); \ if (!fMustAlloc && !*ppMemory) \ fMustAlloc = TRUE; \ if (fMustAlloc) \ - *ppMemory = NdrAllocate(pStubMsg, sizeof(type)); \ - if (pStubMsg->Buffer + sizeof(type) > pStubMsg->BufferEnd) \ + *ppMemory = NdrAllocate(pStubMsg, sizeof(mem_type)); \ + if (pStubMsg->Buffer + sizeof(wire_type) > pStubMsg->BufferEnd) \ { \ ERR("buffer overflow - Buffer = %p, BufferEnd = %p\n", \ pStubMsg->Buffer, (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength); \ RpcRaiseException(RPC_X_BAD_STUB_DATA); \ } \ - if ((*(type *)pStubMsg->Buffer < (type)pRange->low_value) || \ - (*(type *)pStubMsg->Buffer > (type)pRange->high_value)) \ + if ((*(wire_type *)pStubMsg->Buffer < (mem_type)pRange->low_value) || \ + (*(wire_type *)pStubMsg->Buffer > (mem_type)pRange->high_value)) \ { \ ERR("value exceeded bounds: " format_spec ", low: " format_spec ", high: " format_spec "\n", \ - *(type *)pStubMsg->Buffer, (type)pRange->low_value, \ - (type)pRange->high_value); \ + *(wire_type *)pStubMsg->Buffer, (mem_type)pRange->low_value, \ + (mem_type)pRange->high_value); \ RpcRaiseException(RPC_S_INVALID_BOUND); \ return NULL; \ } \ TRACE("*ppMemory: %p\n", *ppMemory); \ - **(type **)ppMemory = *(type *)pStubMsg->Buffer; \ - pStubMsg->Buffer += sizeof(type); \ + **(mem_type **)ppMemory = *(wire_type *)pStubMsg->Buffer; \ + pStubMsg->Buffer += sizeof(wire_type); \ } while (0) switch(base_type) { case RPC_FC_CHAR: case RPC_FC_SMALL: - RANGE_UNMARSHALL(UCHAR, "%d"); + RANGE_UNMARSHALL(UCHAR, UCHAR, "%d"); TRACE("value: 0x%02x\n", **ppMemory); break; case RPC_FC_BYTE: case RPC_FC_USMALL: - RANGE_UNMARSHALL(CHAR, "%u"); + RANGE_UNMARSHALL(CHAR, CHAR, "%u"); TRACE("value: 0x%02x\n", **ppMemory); break; case RPC_FC_WCHAR: /* FIXME: valid? */ case RPC_FC_USHORT: - RANGE_UNMARSHALL(USHORT, "%u"); + RANGE_UNMARSHALL(USHORT, USHORT, "%u"); TRACE("value: 0x%04x\n", **(USHORT **)ppMemory); break; case RPC_FC_SHORT: - RANGE_UNMARSHALL(SHORT, "%d"); + RANGE_UNMARSHALL(SHORT, SHORT, "%d"); TRACE("value: 0x%04x\n", **(USHORT **)ppMemory); break; case RPC_FC_LONG: - RANGE_UNMARSHALL(LONG, "%d"); + case RPC_FC_ENUM32: + RANGE_UNMARSHALL(LONG, LONG, "%d"); TRACE("value: 0x%08x\n", **(ULONG **)ppMemory); break; case RPC_FC_ULONG: - RANGE_UNMARSHALL(ULONG, "%u"); + RANGE_UNMARSHALL(ULONG, ULONG, "%u"); TRACE("value: 0x%08x\n", **(ULONG **)ppMemory); break; case RPC_FC_ENUM16: - case RPC_FC_ENUM32: - FIXME("Unhandled enum type\n"); + RANGE_UNMARSHALL(UINT, USHORT, "%u"); + TRACE("value: 0x%08x\n", **(UINT **)ppMemory); break; - case RPC_FC_ERROR_STATUS_T: /* FIXME: valid? */ case RPC_FC_FLOAT: case RPC_FC_DOUBLE: case RPC_FC_HYPER: @@ -6538,36 +6567,51 @@ static ULONG WINAPI NdrBaseTypeMemorySize( case RPC_FC_WCHAR: case RPC_FC_SHORT: case RPC_FC_USHORT: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT)); safe_buffer_increment(pStubMsg, sizeof(USHORT)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(USHORT)); pStubMsg->MemorySize += sizeof(USHORT); return sizeof(USHORT); case RPC_FC_LONG: case RPC_FC_ULONG: case RPC_FC_ENUM32: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONG)); safe_buffer_increment(pStubMsg, sizeof(ULONG)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(ULONG)); pStubMsg->MemorySize += sizeof(ULONG); return sizeof(ULONG); case RPC_FC_FLOAT: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(float)); safe_buffer_increment(pStubMsg, sizeof(float)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(float)); pStubMsg->MemorySize += sizeof(float); return sizeof(float); case RPC_FC_DOUBLE: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(double)); safe_buffer_increment(pStubMsg, sizeof(double)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(double)); pStubMsg->MemorySize += sizeof(double); return sizeof(double); case RPC_FC_HYPER: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONGLONG)); safe_buffer_increment(pStubMsg, sizeof(ULONGLONG)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(ULONGLONG)); pStubMsg->MemorySize += sizeof(ULONGLONG); return sizeof(ULONGLONG); case RPC_FC_ERROR_STATUS_T: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(error_status_t)); safe_buffer_increment(pStubMsg, sizeof(error_status_t)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(error_status_t)); pStubMsg->MemorySize += sizeof(error_status_t); return sizeof(error_status_t); case RPC_FC_ENUM16: + ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT)); safe_buffer_increment(pStubMsg, sizeof(USHORT)); + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(UINT)); pStubMsg->MemorySize += sizeof(UINT); return sizeof(UINT); case RPC_FC_IGNORE: + ALIGN_LENGTH(pStubMsg->MemorySize, sizeof(void *)); pStubMsg->MemorySize += sizeof(void *); return sizeof(void *); default: @@ -6627,7 +6671,7 @@ static unsigned char *WINAPI NdrContextHandleMarshall( if (pFormat[1] & 0x80) NdrClientContextMarshall(pStubMsg, *(NDR_CCONTEXT **)pMemory, FALSE); else - NdrClientContextMarshall(pStubMsg, (NDR_CCONTEXT *)pMemory, FALSE); + NdrClientContextMarshall(pStubMsg, pMemory, FALSE); return NULL; }