diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/build/pidl/parser.pm | 2 | ||||
-rw-r--r-- | source4/librpc/idl/epmapper.idl | 2 | ||||
-rw-r--r-- | source4/librpc/idl/idl_types.h | 1 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr.c | 11 |
4 files changed, 14 insertions, 2 deletions
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index abf5785a45..28926b7208 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -135,7 +135,7 @@ sub start_flags($) my $flags = util::has_property($e, "flag"); if (defined $flags) { pidl "\t{ uint32_t _flags_save_$e->{TYPE} = ndr->flags;\n"; - pidl "\tndr->flags |= $flags;\n"; + pidl "\tndr_set_flags(&ndr->flags, $flags);\n"; } } diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index fffd2606c0..7ea58e354f 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -149,7 +149,7 @@ interface epmapper typedef struct { } epm_rhs_ncalrpc; - typedef [nodiscriminant] union { + typedef [flag(NDR_BIG_ENDIAN),nodiscriminant] union { [case(EPM_PROTOCOL_DNET_NSP)] epm_rhs_dnet_nsp dnet_nsp; [case(EPM_PROTOCOL_OSI_TP4)] epm_rhs_osi_tp4 osi_tp4; [case(EPM_PROTOCOL_OSI_CLNS)] epm_rhs_osi_clns osi_clns; diff --git a/source4/librpc/idl/idl_types.h b/source4/librpc/idl/idl_types.h index 86f4e17959..d2d32245f3 100644 --- a/source4/librpc/idl/idl_types.h +++ b/source4/librpc/idl/idl_types.h @@ -66,6 +66,7 @@ /* this flag is used to force a section of IDL as little endian. It is needed for the epmapper IDL, which is defined as always being LE */ #define NDR_LITTLE_ENDIAN LIBNDR_FLAG_LITTLE_ENDIAN +#define NDR_BIG_ENDIAN LIBNDR_FLAG_BIGENDIAN /* diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c index 959616fc78..4f6f135cd6 100644 --- a/source4/librpc/ndr/ndr.c +++ b/source4/librpc/ndr/ndr.c @@ -350,6 +350,17 @@ void ndr_print_function_debug(void (*fn)(struct ndr_print *, const char *, int , talloc_free(ndr); } +void ndr_set_flags(uint32_t *pflags, uint32_t new_flags) +{ + /* the big/little endian flags are inter-dependent */ + if (new_flags & LIBNDR_FLAG_LITTLE_ENDIAN) { + (*pflags) &= ~LIBNDR_FLAG_BIGENDIAN; + } + if (new_flags & LIBNDR_FLAG_BIGENDIAN) { + (*pflags) &= ~LIBNDR_FLAG_LITTLE_ENDIAN; + } + (*pflags) |= new_flags; +} static NTSTATUS ndr_map_error(enum ndr_err_code err) { |