mirror of https://github.com/FreeRDP/FreeRDP
[channels,rdpear] fix inconsistencies in ndr.c/h
This commit is contained in:
parent
1c161b0270
commit
f0a73e3e9c
|
@ -29,7 +29,6 @@
|
||||||
#define NDR_MAX_CONSTRUCTS 16
|
#define NDR_MAX_CONSTRUCTS 16
|
||||||
#define NDR_MAX_DEFERRED 50
|
#define NDR_MAX_DEFERRED 50
|
||||||
|
|
||||||
/** @brief */
|
|
||||||
struct NdrContext_s
|
struct NdrContext_s
|
||||||
{
|
{
|
||||||
BYTE version;
|
BYTE version;
|
||||||
|
@ -113,13 +112,13 @@ void ndr_context_free(NdrContext* context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ndr_context_bytes_read(NdrContext* context, size_t len)
|
static void ndr_context_bytes_read(NdrContext* context, size_t len)
|
||||||
{
|
{
|
||||||
WINPR_ASSERT(context);
|
WINPR_ASSERT(context);
|
||||||
context->indentLevels[context->currentLevel] += len;
|
context->indentLevels[context->currentLevel] += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ndr_context_bytes_written(NdrContext* context, size_t len)
|
static void ndr_context_bytes_written(NdrContext* context, size_t len)
|
||||||
{
|
{
|
||||||
ndr_context_bytes_read(context, len);
|
ndr_context_bytes_read(context, len);
|
||||||
}
|
}
|
||||||
|
@ -284,8 +283,10 @@ BOOL ndr_end_constructed(NdrContext* context, wStream* s)
|
||||||
Stream_StaticInit(&staticS, Stream_Buffer(s) + offset, 4);
|
Stream_StaticInit(&staticS, Stream_Buffer(s) + offset, 4);
|
||||||
|
|
||||||
/* len */
|
/* len */
|
||||||
size_t len = Stream_GetPosition(s) - (offset + 8);
|
const size_t len = Stream_GetPosition(s) - (offset + 8);
|
||||||
if (!ndr_write_uint32(context, &staticS, len))
|
if (len > UINT32_MAX)
|
||||||
|
return FALSE;
|
||||||
|
if (!ndr_write_uint32(context, &staticS, (UINT32)len))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -432,8 +433,7 @@ SIMPLE_TYPE_IMPL(UINT64, uint64)
|
||||||
WINPR_ASSERT(context); \
|
WINPR_ASSERT(context); \
|
||||||
WINPR_ASSERT(s); \
|
WINPR_ASSERT(s); \
|
||||||
WINPR_ASSERT(hints); \
|
WINPR_ASSERT(hints); \
|
||||||
return ndr_read_uconformant_array(context, s, (NdrArrayHints*)hints, ndr_##TYPE##_descr(), \
|
return ndr_read_uconformant_array(context, s, hints, ndr_##TYPE##_descr(), v); \
|
||||||
(void*)v); \
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
BOOL ndr_write_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, \
|
BOOL ndr_write_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, \
|
||||||
|
@ -442,16 +442,15 @@ SIMPLE_TYPE_IMPL(UINT64, uint64)
|
||||||
WINPR_ASSERT(context); \
|
WINPR_ASSERT(context); \
|
||||||
WINPR_ASSERT(s); \
|
WINPR_ASSERT(s); \
|
||||||
WINPR_ASSERT(hints); \
|
WINPR_ASSERT(hints); \
|
||||||
NdrArrayHints* ahints = (NdrArrayHints*)hints; \
|
const NdrArrayHints* ahints = (const NdrArrayHints*)hints; \
|
||||||
return ndr_write_uconformant_array(context, s, ahints->count, ndr_##TYPE##_descr(), \
|
return ndr_write_uconformant_array(context, s, ahints->count, ndr_##TYPE##_descr(), v); \
|
||||||
(const void*)v); \
|
|
||||||
} \
|
} \
|
||||||
void ndr_destroy_##TYPE##Array(NdrContext* context, const void* hints, void* obj) \
|
void ndr_destroy_##TYPE##Array(NdrContext* context, const void* hints, void* obj) \
|
||||||
{ \
|
{ \
|
||||||
WINPR_ASSERT(context); \
|
WINPR_ASSERT(context); \
|
||||||
WINPR_ASSERT(obj); \
|
WINPR_ASSERT(obj); \
|
||||||
WINPR_ASSERT(hints); \
|
WINPR_ASSERT(hints); \
|
||||||
NdrArrayHints* ahints = (NdrArrayHints*)hints; \
|
const NdrArrayHints* ahints = (const NdrArrayHints*)hints; \
|
||||||
NdrMessageType descr = ndr_##TYPE##_descr(); \
|
NdrMessageType descr = ndr_##TYPE##_descr(); \
|
||||||
if (descr->destroyFn) \
|
if (descr->destroyFn) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -477,7 +476,7 @@ SIMPLE_TYPE_IMPL(UINT64, uint64)
|
||||||
WINPR_ASSERT(context); \
|
WINPR_ASSERT(context); \
|
||||||
WINPR_ASSERT(s); \
|
WINPR_ASSERT(s); \
|
||||||
WINPR_ASSERT(hints); \
|
WINPR_ASSERT(hints); \
|
||||||
return ndr_read_uconformant_varying_array(context, s, (NdrVaryingArrayHints*)hints, \
|
return ndr_read_uconformant_varying_array(context, s, (const NdrVaryingArrayHints*)hints, \
|
||||||
ndr_##TYPE##_descr(), v); \
|
ndr_##TYPE##_descr(), v); \
|
||||||
} \
|
} \
|
||||||
BOOL ndr_write_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
|
BOOL ndr_write_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
|
||||||
|
@ -486,7 +485,7 @@ SIMPLE_TYPE_IMPL(UINT64, uint64)
|
||||||
WINPR_ASSERT(context); \
|
WINPR_ASSERT(context); \
|
||||||
WINPR_ASSERT(s); \
|
WINPR_ASSERT(s); \
|
||||||
WINPR_ASSERT(hints); \
|
WINPR_ASSERT(hints); \
|
||||||
return ndr_write_uconformant_varying_array(context, s, (NdrVaryingArrayHints*)hints, \
|
return ndr_write_uconformant_varying_array(context, s, (const NdrVaryingArrayHints*)hints, \
|
||||||
ndr_##TYPE##_descr(), v); \
|
ndr_##TYPE##_descr(), v); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
@ -495,7 +494,7 @@ SIMPLE_TYPE_IMPL(UINT64, uint64)
|
||||||
ndr_read_##TYPE##VaryingArray, \
|
ndr_read_##TYPE##VaryingArray, \
|
||||||
ndr_write_##TYPE##VaryingArray, \
|
ndr_write_##TYPE##VaryingArray, \
|
||||||
NULL, \
|
NULL, \
|
||||||
(NDR_DUMP_FN)NULL }; \
|
NULL }; \
|
||||||
\
|
\
|
||||||
NdrMessageType ndr_##TYPE##VaryingArray_descr(void) \
|
NdrMessageType ndr_##TYPE##VaryingArray_descr(void) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -643,7 +642,7 @@ BOOL ndr_struct_read_fromDescr(NdrContext* context, wStream* s, const NdrStructD
|
||||||
if (field->hintsField >= 0)
|
if (field->hintsField >= 0)
|
||||||
{
|
{
|
||||||
/* computes the address of the hints field if any */
|
/* computes the address of the hints field if any */
|
||||||
WINPR_ASSERT(field->hintsField < descr->nfields);
|
WINPR_ASSERT((size_t)field->hintsField < descr->nfields);
|
||||||
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
||||||
|
|
||||||
hints = (BYTE*)target + hintsField->structOffset;
|
hints = (BYTE*)target + hintsField->structOffset;
|
||||||
|
@ -711,17 +710,17 @@ BOOL ndr_struct_write_fromDescr(NdrContext* context, wStream* s, const NdrStruct
|
||||||
for (size_t i = 0; i < descr->nfields; i++)
|
for (size_t i = 0; i < descr->nfields; i++)
|
||||||
{
|
{
|
||||||
const NdrFieldStruct* field = &descr->fields[i];
|
const NdrFieldStruct* field = &descr->fields[i];
|
||||||
BYTE* ptr = (BYTE*)src + field->structOffset;
|
const BYTE* ptr = (const BYTE*)src + field->structOffset;
|
||||||
|
|
||||||
void* hints = NULL;
|
const void* hints = NULL;
|
||||||
|
|
||||||
if (field->hintsField >= 0)
|
if (field->hintsField >= 0)
|
||||||
{
|
{
|
||||||
/* computes the address of the hints field if any */
|
/* computes the address of the hints field if any */
|
||||||
WINPR_ASSERT(field->hintsField < descr->nfields);
|
WINPR_ASSERT((size_t)field->hintsField < descr->nfields);
|
||||||
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
||||||
|
|
||||||
hints = (BYTE*)src + hintsField->structOffset;
|
hints = (const BYTE*)src + hintsField->structOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (field->pointerType)
|
switch (field->pointerType)
|
||||||
|
@ -731,7 +730,7 @@ BOOL ndr_struct_write_fromDescr(NdrContext* context, wStream* s, const NdrStruct
|
||||||
{
|
{
|
||||||
ndr_refid ptrId = NDR_PTR_NULL;
|
ndr_refid ptrId = NDR_PTR_NULL;
|
||||||
BOOL isNew = 0;
|
BOOL isNew = 0;
|
||||||
ptr = *(void**)ptr;
|
ptr = *(const void**)ptr;
|
||||||
|
|
||||||
if (!ptr && field->pointerType == NDR_POINTER_NON_NULL)
|
if (!ptr && field->pointerType == NDR_POINTER_NON_NULL)
|
||||||
{
|
{
|
||||||
|
@ -754,8 +753,8 @@ BOOL ndr_struct_write_fromDescr(NdrContext* context, wStream* s, const NdrStruct
|
||||||
}
|
}
|
||||||
|
|
||||||
deferred->name = field->name;
|
deferred->name = field->name;
|
||||||
deferred->hints = hints;
|
deferred->hints = WINPR_CAST_CONST_PTR_AWAY(hints, void*);
|
||||||
deferred->target = ptr;
|
deferred->target = WINPR_CAST_CONST_PTR_AWAY(ptr, void*);
|
||||||
deferred->msg = field->typeDescr;
|
deferred->msg = field->typeDescr;
|
||||||
ndeferred++;
|
ndeferred++;
|
||||||
}
|
}
|
||||||
|
@ -792,13 +791,13 @@ void ndr_struct_dump_fromDescr(wLog* logger, UINT32 lvl, size_t identLevel,
|
||||||
for (size_t i = 0; i < descr->nfields; i++)
|
for (size_t i = 0; i < descr->nfields; i++)
|
||||||
{
|
{
|
||||||
const NdrFieldStruct* field = &descr->fields[i];
|
const NdrFieldStruct* field = &descr->fields[i];
|
||||||
BYTE* ptr = (BYTE*)obj + field->structOffset;
|
const BYTE* ptr = (const BYTE*)obj + field->structOffset;
|
||||||
|
|
||||||
switch (field->pointerType)
|
switch (field->pointerType)
|
||||||
{
|
{
|
||||||
case NDR_POINTER:
|
case NDR_POINTER:
|
||||||
case NDR_POINTER_NON_NULL:
|
case NDR_POINTER_NON_NULL:
|
||||||
ptr = *(void**)ptr;
|
ptr = *(const void**)ptr;
|
||||||
break;
|
break;
|
||||||
case NDR_NOT_POINTER:
|
case NDR_NOT_POINTER:
|
||||||
break;
|
break;
|
||||||
|
@ -830,7 +829,7 @@ void ndr_struct_destroy(NdrContext* context, const NdrStructDescr* descr, void*
|
||||||
if (field->hintsField >= 0)
|
if (field->hintsField >= 0)
|
||||||
{
|
{
|
||||||
/* computes the address of the hints field if any */
|
/* computes the address of the hints field if any */
|
||||||
WINPR_ASSERT(field->hintsField < descr->nfields);
|
WINPR_ASSERT((size_t)field->hintsField < descr->nfields);
|
||||||
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
const NdrFieldStruct* hintsField = &descr->fields[field->hintsField];
|
||||||
|
|
||||||
hints = (BYTE*)pptr + hintsField->structOffset;
|
hints = (BYTE*)pptr + hintsField->structOffset;
|
||||||
|
@ -863,7 +862,7 @@ typedef struct
|
||||||
ndr_refid* presult;
|
ndr_refid* presult;
|
||||||
} FindValueArgs;
|
} FindValueArgs;
|
||||||
|
|
||||||
BOOL findValueRefFn(const void* key, void* value, void* parg)
|
static BOOL findValueRefFn(const void* key, void* value, void* parg)
|
||||||
{
|
{
|
||||||
WINPR_ASSERT(parg);
|
WINPR_ASSERT(parg);
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,31 @@
|
||||||
#include <winpr/stream.h>
|
#include <winpr/stream.h>
|
||||||
#include <freerdp/api.h>
|
#include <freerdp/api.h>
|
||||||
|
|
||||||
|
#define NDR_PTR_NULL (0UL)
|
||||||
|
|
||||||
|
#define NDR_SIMPLE_TYPE_DECL(LOWER, UPPER) \
|
||||||
|
BOOL ndr_read_##LOWER(NdrContext* context, wStream* s, UPPER* v); \
|
||||||
|
BOOL ndr_read_##LOWER##_(NdrContext* context, wStream* s, const void* hints, void* v); \
|
||||||
|
BOOL ndr_write_##LOWER(NdrContext* context, wStream* s, UPPER v); \
|
||||||
|
BOOL ndr_write_##LOWER##_(NdrContext* context, wStream* s, const void* hints, const void* v); \
|
||||||
|
extern const NdrMessageDescr ndr_##LOWER##_descr_s; \
|
||||||
|
NdrMessageType ndr_##LOWER##_descr(void)
|
||||||
|
|
||||||
|
#define NDR_ARRAY_OF_TYPE_DECL(TYPE, UPPERTYPE) \
|
||||||
|
BOOL ndr_read_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, void* v); \
|
||||||
|
BOOL ndr_write_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, \
|
||||||
|
const void* v); \
|
||||||
|
void ndr_destroy_##TYPE##Array(NdrContext* context, const void* hints, void* obj); \
|
||||||
|
extern const NdrMessageDescr ndr_##TYPE##Array_descr_s; \
|
||||||
|
NdrMessageType ndr_##TYPE##Array_descr(void); \
|
||||||
|
\
|
||||||
|
BOOL ndr_read_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
|
||||||
|
void* v); \
|
||||||
|
BOOL ndr_write_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
|
||||||
|
const void* v); \
|
||||||
|
extern const NdrMessageDescr ndr_##TYPE##VaryingArray_descr_s; \
|
||||||
|
NdrMessageType ndr_##TYPE##VaryingArray_descr(void)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
|
@ -31,7 +56,6 @@ extern "C"
|
||||||
typedef struct NdrContext_s NdrContext;
|
typedef struct NdrContext_s NdrContext;
|
||||||
|
|
||||||
typedef UINT32 ndr_refid;
|
typedef UINT32 ndr_refid;
|
||||||
#define NDR_PTR_NULL (0UL)
|
|
||||||
|
|
||||||
typedef BOOL (*NDR_READER_FN)(NdrContext* context, wStream* s, const void* hints, void* target);
|
typedef BOOL (*NDR_READER_FN)(NdrContext* context, wStream* s, const void* hints, void* target);
|
||||||
typedef BOOL (*NDR_WRITER_FN)(NdrContext* context, wStream* s, const void* hints,
|
typedef BOOL (*NDR_WRITER_FN)(NdrContext* context, wStream* s, const void* hints,
|
||||||
|
@ -96,7 +120,7 @@ extern "C"
|
||||||
NdrMessageType msg;
|
NdrMessageType msg;
|
||||||
} NdrDeferredEntry;
|
} NdrDeferredEntry;
|
||||||
|
|
||||||
void ndr_context_free(NdrContext* pcontext);
|
void ndr_context_free(NdrContext* context);
|
||||||
|
|
||||||
static INLINE void ndr_context_destroy(NdrContext** pcontext)
|
static INLINE void ndr_context_destroy(NdrContext** pcontext)
|
||||||
{
|
{
|
||||||
|
@ -118,25 +142,13 @@ extern "C"
|
||||||
|
|
||||||
BOOL ndr_write_header(NdrContext* context, wStream* s);
|
BOOL ndr_write_header(NdrContext* context, wStream* s);
|
||||||
|
|
||||||
BOOL ndr_write_uint8(NdrContext* context, wStream* s, BYTE v);
|
NDR_SIMPLE_TYPE_DECL(uint8, UINT8);
|
||||||
BOOL ndr_write_uint8_(NdrContext* context, wStream* s, const void* hints, const void* v);
|
|
||||||
NdrMessageType ndr_uint8_descr(void);
|
|
||||||
|
|
||||||
#define NDR_SIMPLE_TYPE_DECL(LOWER, UPPER) \
|
|
||||||
BOOL ndr_read_##LOWER(NdrContext* context, wStream* s, UPPER* v); \
|
|
||||||
BOOL ndr_write_##LOWER(NdrContext* context, wStream* s, UPPER v); \
|
|
||||||
BOOL ndr_write_##LOWER##_(NdrContext* context, wStream* s, const void* hints, const void* v); \
|
|
||||||
extern const NdrMessageDescr ndr_##LOWER##_descr_s; \
|
|
||||||
NdrMessageType ndr_##LOWER##_descr(void)
|
|
||||||
|
|
||||||
NDR_SIMPLE_TYPE_DECL(uint16, UINT16);
|
NDR_SIMPLE_TYPE_DECL(uint16, UINT16);
|
||||||
NDR_SIMPLE_TYPE_DECL(uint32, UINT32);
|
NDR_SIMPLE_TYPE_DECL(uint32, UINT32);
|
||||||
NDR_SIMPLE_TYPE_DECL(uint64, UINT64);
|
NDR_SIMPLE_TYPE_DECL(uint64, UINT64);
|
||||||
|
|
||||||
extern const NdrMessageDescr ndr_uint8Array_descr_s;
|
NDR_ARRAY_OF_TYPE_DECL(uint8, BYTE);
|
||||||
NdrMessageType ndr_uint8Array_descr(void);
|
NDR_ARRAY_OF_TYPE_DECL(uint16, UINT16);
|
||||||
NdrMessageType ndr_uint16Array_descr(void);
|
|
||||||
NdrMessageType ndr_uint16VaryingArray_descr(void);
|
|
||||||
|
|
||||||
BOOL ndr_skip_bytes(NdrContext* context, wStream* s, size_t nbytes);
|
BOOL ndr_skip_bytes(NdrContext* context, wStream* s, size_t nbytes);
|
||||||
BOOL ndr_read_align(NdrContext* context, wStream* s, size_t sz);
|
BOOL ndr_read_align(NdrContext* context, wStream* s, size_t sz);
|
||||||
|
|
Loading…
Reference in New Issue