1From 39a3fa39967faaf216be8e108ca57d07de1aa95a Mon Sep 17 00:00:00 2001 2From: Vadim Zhukov <persgray@gmail.com> 3Date: Sat, 25 May 2013 15:19:24 +0100 4Subject: [PATCH 01/41] pidl: Recent Perl warns about "defined(@var)" 5 constructs. 6 7Signed-off-by: Jelmer Vernooij <jelmer@samba.org> 8 9Autobuild-User(master): Jelmer Vernooij <jelmer@samba.org> 10Autobuild-Date(master): Sat May 25 18:10:53 CEST 2013 on sn-devel-104 11 12(cherry picked from commit 92254d09e0ee5a7d9d0cd91fe1803f54e64d9a5f) 13--- 14 pidl/lib/Parse/Pidl/ODL.pm | 2 +- 15 pidl/pidl | 2 +- 16 2 files changed, 2 insertions(+), 2 deletions(-) 17 18--- a/pidl/lib/Parse/Pidl/ODL.pm 19+++ b/pidl/lib/Parse/Pidl/ODL.pm 20@@ -70,7 +70,7 @@ sub ODL2IDL 21 next; 22 } 23 my $podl = Parse::Pidl::IDL::parse_file($idl_path, $opt_incdirs); 24- if (defined(@$podl)) { 25+ if (defined($podl)) { 26 require Parse::Pidl::Typelist; 27 my $basename = basename($idl_path, ".idl"); 28 29--- a/pidl/pidl 30+++ b/pidl/pidl 31@@ -605,7 +605,7 @@ sub process_file($) 32 require Parse::Pidl::IDL; 33 34 $pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs); 35- defined @$pidl || die "Failed to parse $idl_file"; 36+ defined $pidl || die "Failed to parse $idl_file"; 37 } 38 39 require Parse::Pidl::Typelist; 40--- a/source4/heimdal/cf/make-proto.pl 41+++ b/source4/heimdal/cf/make-proto.pl 42@@ -1,8 +1,8 @@ 43 # Make prototypes from .c files 44 # $Id$ 45 46-##use Getopt::Std; 47-require 'getopts.pl'; 48+use Getopt::Std; 49+#require 'getopts.pl'; 50 51 my $comment = 0; 52 my $if_0 = 0; 53@@ -12,7 +12,7 @@ my $debug = 0; 54 my $oproto = 1; 55 my $private_func_re = "^_"; 56 57-Getopts('x:m:o:p:dqE:R:P:') || die "foo"; 58+getopts('x:m:o:p:dqE:R:P:') || die "foo"; 59 60 if($opt_d) { 61 $debug = 1; 62--- a/source3/Makefile-smbtorture4 63+++ b/source3/Makefile-smbtorture4 64@@ -6,7 +6,7 @@ SAMBA4_BINARIES="smbtorture,ndrdump" 65 samba4-configure: 66 @(cd .. && \ 67 CFLAGS='' $(WAF) reconfigure || \ 68- CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure ) 69+ CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure --bundled-libraries=ALL --disable-gnutls ) 70 71 .PHONY: samba4-configure 72 73--- a/source4/lib/ldb/wscript 74+++ b/source4/lib/ldb/wscript 75@@ -135,9 +135,7 @@ def build(bld): 76 pc_files=ldb_pc_files, 77 vnum=VERSION, 78 private_library=private_library, 79- manpages='man/ldb.3', 80- abi_directory = 'ABI', 81- abi_match = abi_match) 82+ manpages='man/ldb.3') 83 84 # generate a include/ldb_version.h 85 t = bld.SAMBA_GENERATOR('ldb_version.h', 86--- a/source3/selftest/skip 87+++ b/source3/selftest/skip 88@@ -22,3 +22,8 @@ samba3.*raw.ioctl 89 samba3.*raw.qfileinfo 90 samba3.*raw.qfsinfo 91 samba3.*raw.sfileinfo.base 92+# skip, don't work for badlock backports 93+samba3.posix_s3.raw.eas 94+samba3.posix_s3.raw.rename 95+samba3.posix_s3.raw.search 96+samba3.posix_s3.raw.streams 97--- a/librpc/ndr/ndr_ntlmssp.c 98+++ b/librpc/ndr/ndr_ntlmssp.c 99@@ -176,4 +176,20 @@ _PUBLIC_ void ndr_print_ntlmssp_Version( 100 } 101 } 102 103+_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list, 104+ enum ntlmssp_AvId AvId) 105+{ 106+ struct AV_PAIR *res = NULL; 107+ uint32_t i = 0; 108 109+ for (i = 0; i < av_list->count; i++) { 110+ if (av_list->pair[i].AvId != AvId) { 111+ continue; 112+ } 113+ 114+ res = discard_const_p(struct AV_PAIR, &av_list->pair[i]); 115+ break; 116+ } 117+ 118+ return res; 119+} 120--- a/librpc/ndr/ndr_ntlmssp.h 121+++ b/librpc/ndr/ndr_ntlmssp.h 122@@ -31,3 +31,5 @@ _PUBLIC_ void ndr_print_ntlmssp_lm_respo 123 bool ntlmv2); 124 _PUBLIC_ void ndr_print_ntlmssp_Version(struct ndr_print *ndr, const char *name, const union ntlmssp_Version *r); 125 126+_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list, 127+ enum ntlmssp_AvId AvId); 128--- /dev/null 129+++ b/librpc/ABI/ndr-0.0.2.sigs 130@@ -0,0 +1,247 @@ 131+GUID_all_zero: bool (const struct GUID *) 132+GUID_compare: int (const struct GUID *, const struct GUID *) 133+GUID_equal: bool (const struct GUID *, const struct GUID *) 134+GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) 135+GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) 136+GUID_from_string: NTSTATUS (const char *, struct GUID *) 137+GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *) 138+GUID_random: struct GUID (void) 139+GUID_string: char *(TALLOC_CTX *, const struct GUID *) 140+GUID_string2: char *(TALLOC_CTX *, const struct GUID *) 141+GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *) 142+GUID_zero: struct GUID (void) 143+ndr_align_size: size_t (uint32_t, size_t) 144+ndr_charset_length: uint32_t (const void *, charset_t) 145+ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) 146+ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) 147+ndr_check_padding: void (struct ndr_pull *, size_t) 148+ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t) 149+ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t) 150+ndr_get_array_length: uint32_t (struct ndr_pull *, const void *) 151+ndr_get_array_size: uint32_t (struct ndr_pull *, const void *) 152+ndr_map_error2errno: int (enum ndr_err_code) 153+ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code) 154+ndr_map_error2string: const char *(enum ndr_err_code) 155+ndr_policy_handle_empty: bool (const struct policy_handle *) 156+ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *) 157+ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB) 158+ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *) 159+ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *) 160+ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS) 161+ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME) 162+ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME) 163+ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME) 164+ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR) 165+ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t) 166+ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t) 167+ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t) 168+ndr_print_bool: void (struct ndr_print *, const char *, const bool) 169+ndr_print_debug: void (ndr_print_fn_t, const char *, void *) 170+ndr_print_debug_helper: void (struct ndr_print *, const char *, ...) 171+ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *) 172+ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...) 173+ndr_print_dlong: void (struct ndr_print *, const char *, int64_t) 174+ndr_print_double: void (struct ndr_print *, const char *, double) 175+ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t) 176+ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *) 177+ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *) 178+ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *) 179+ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t) 180+ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t) 181+ndr_print_int16: void (struct ndr_print *, const char *, int16_t) 182+ndr_print_int32: void (struct ndr_print *, const char *, int32_t) 183+ndr_print_int3264: void (struct ndr_print *, const char *, int32_t) 184+ndr_print_int8: void (struct ndr_print *, const char *, int8_t) 185+ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *) 186+ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *) 187+ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *) 188+ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID) 189+ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType) 190+ndr_print_null: void (struct ndr_print *) 191+ndr_print_pointer: void (struct ndr_print *, const char *, void *) 192+ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *) 193+ndr_print_printf_helper: void (struct ndr_print *, const char *, ...) 194+ndr_print_ptr: void (struct ndr_print *, const char *, const void *) 195+ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t) 196+ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *) 197+ndr_print_string: void (struct ndr_print *, const char *, const char *) 198+ndr_print_string_array: void (struct ndr_print *, const char *, const char **) 199+ndr_print_string_helper: void (struct ndr_print *, const char *, ...) 200+ndr_print_struct: void (struct ndr_print *, const char *, const char *) 201+ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *) 202+ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t) 203+ndr_print_time_t: void (struct ndr_print *, const char *, time_t) 204+ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *) 205+ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *) 206+ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t) 207+ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t) 208+ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t) 209+ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t) 210+ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t) 211+ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t) 212+ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t) 213+ndr_print_union: void (struct ndr_print *, const char *, int, const char *) 214+ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *) 215+ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *) 216+ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *) 217+ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type) 218+ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *) 219+ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *) 220+ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *) 221+ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *) 222+ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 223+ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 224+ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 225+ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *) 226+ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t) 227+ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t) 228+ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *) 229+ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *) 230+ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t) 231+ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t) 232+ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) 233+ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) 234+ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *) 235+ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *) 236+ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 237+ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 238+ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 239+ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) 240+ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...) 241+ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) 242+ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *) 243+ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *) 244+ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *) 245+ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 246+ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *) 247+ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *) 248+ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *) 249+ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *) 250+ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **) 251+ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **) 252+ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *) 253+ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *) 254+ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *) 255+ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **) 256+ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *) 257+ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) 258+ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 259+ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *) 260+ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *) 261+ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t) 262+ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 263+ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 264+ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *) 265+ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **) 266+ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***) 267+ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) 268+ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) 269+ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t) 270+ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t) 271+ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 272+ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *) 273+ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *) 274+ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *) 275+ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t) 276+ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 277+ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 278+ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *) 279+ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 280+ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 281+ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 282+ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 283+ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) 284+ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t) 285+ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) 286+ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) 287+ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *) 288+ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *) 289+ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB) 290+ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *) 291+ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *) 292+ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS) 293+ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME) 294+ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME) 295+ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME) 296+ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR) 297+ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t) 298+ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t) 299+ndr_push_blob: DATA_BLOB (struct ndr_push *) 300+ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t) 301+ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t) 302+ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t) 303+ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double) 304+ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) 305+ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) 306+ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) 307+ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) 308+ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...) 309+ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t) 310+ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *) 311+ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *) 312+ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *) 313+ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t) 314+ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t) 315+ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *) 316+ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t) 317+ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t) 318+ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t) 319+ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *) 320+ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *) 321+ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *) 322+ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID) 323+ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType) 324+ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t) 325+ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *) 326+ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *) 327+ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *) 328+ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) 329+ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *) 330+ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *) 331+ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t) 332+ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) 333+ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) 334+ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *) 335+ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) 336+ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *) 337+ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *) 338+ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **) 339+ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t) 340+ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t) 341+ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t) 342+ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t) 343+ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t) 344+ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *) 345+ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *) 346+ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t) 347+ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t) 348+ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t) 349+ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t) 350+ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) 351+ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) 352+ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) 353+ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t) 354+ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) 355+ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t) 356+ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t) 357+ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *) 358+ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *) 359+ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type) 360+ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t) 361+ndr_set_flags: void (uint32_t *, uint32_t) 362+ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int) 363+ndr_size_GUID: size_t (const struct GUID *, int) 364+ndr_size_string: uint32_t (int, const char * const *, int) 365+ndr_size_string_array: size_t (const char **, uint32_t, int) 366+ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t) 367+ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t) 368+ndr_string_array_size: size_t (struct ndr_push *, const char *) 369+ndr_string_length: uint32_t (const void *, uint32_t) 370+ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *) 371+ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0 372+ndr_token_peek: uint32_t (struct ndr_token_list **, const void *) 373+ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *) 374+ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool) 375+ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t) 376+ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2 377+ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\314\066"}, if_version = 1 378--- a/librpc/ndr/libndr.h 379+++ b/librpc/ndr/libndr.h 380@@ -124,6 +124,20 @@ struct ndr_print { 381 #define LIBNDR_FLAG_STR_UTF8 (1<<12) 382 #define LIBNDR_STRING_FLAGS (0x7FFC) 383 384+/* 385+ * don't debug NDR_ERR_BUFSIZE failures, 386+ * as the available buffer might be incomplete. 387+ * 388+ * return NDR_ERR_INCOMPLETE_BUFFER instead. 389+ */ 390+#define LIBNDR_FLAG_INCOMPLETE_BUFFER (1<<16) 391+ 392+/* 393+ * This lets ndr_pull_subcontext_end() return 394+ * NDR_ERR_UNREAD_BYTES. 395+ */ 396+#define LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES (1<<17) 397+ 398 /* set if relative pointers should *not* be marshalled in reverse order */ 399 #define LIBNDR_FLAG_NO_RELATIVE_REVERSE (1<<18) 400 401@@ -163,6 +177,7 @@ struct ndr_print { 402 403 /* useful macro for debugging */ 404 #define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p) 405+#define NDR_PRINT_DEBUGC(dbgc_class, type, p) ndr_print_debugc(dbgc_class, (ndr_print_fn_t)ndr_print_ ##type, #p, p) 406 #define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_fn_t)ndr_print_ ##type, #p, level, p) 407 #define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p) 408 #define NDR_PRINT_BOTH_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_BOTH, p) 409@@ -199,7 +214,9 @@ enum ndr_err_code { 410 NDR_ERR_IPV6ADDRESS, 411 NDR_ERR_INVALID_POINTER, 412 NDR_ERR_UNREAD_BYTES, 413- NDR_ERR_NDR64 414+ NDR_ERR_NDR64, 415+ NDR_ERR_FLAGS, 416+ NDR_ERR_INCOMPLETE_BUFFER 417 }; 418 419 #define NDR_ERR_CODE_IS_SUCCESS(x) (x == NDR_ERR_SUCCESS) 420@@ -217,20 +234,52 @@ enum ndr_compression_alg { 421 422 /* 423 flags passed to control parse flow 424+ These are deliberately in a different range to the NDR_IN/NDR_OUT 425+ flags to catch mixups 426 */ 427-#define NDR_SCALARS 1 428-#define NDR_BUFFERS 2 429+#define NDR_SCALARS 0x100 430+#define NDR_BUFFERS 0x200 431 432 /* 433- flags passed to ndr_print_*() 434+ flags passed to ndr_print_*() and ndr pull/push for functions 435+ These are deliberately in a different range to the NDR_SCALARS/NDR_BUFFERS 436+ flags to catch mixups 437 */ 438-#define NDR_IN 1 439-#define NDR_OUT 2 440-#define NDR_BOTH 3 441-#define NDR_SET_VALUES 4 442+#define NDR_IN 0x10 443+#define NDR_OUT 0x20 444+#define NDR_BOTH 0x30 445+#define NDR_SET_VALUES 0x40 446+ 447+ 448+#define NDR_PULL_CHECK_FLAGS(ndr, ndr_flags) do { \ 449+ if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) { \ 450+ return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid pull struct ndr_flags 0x%x", ndr_flags); \ 451+ } \ 452+} while (0) 453+ 454+#define NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags) do { \ 455+ if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) \ 456+ return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid push struct ndr_flags 0x%x", ndr_flags); \ 457+} while (0) 458+ 459+#define NDR_PULL_CHECK_FN_FLAGS(ndr, flags) do { \ 460+ if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) { \ 461+ return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid fn pull flags 0x%x", flags); \ 462+ } \ 463+} while (0) 464+ 465+#define NDR_PUSH_CHECK_FN_FLAGS(ndr, flags) do { \ 466+ if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) \ 467+ return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid fn push flags 0x%x", flags); \ 468+} while (0) 469 470 #define NDR_PULL_NEED_BYTES(ndr, n) do { \ 471 if (unlikely((n) > ndr->data_size || ndr->offset + (n) > ndr->data_size)) { \ 472+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \ 473+ uint32_t _available = ndr->data_size - ndr->offset; \ 474+ uint32_t _missing = n - _available; \ 475+ ndr->relative_highest_offset = _missing; \ 476+ } \ 477 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull bytes %u (%s)", (unsigned)n, __location__); \ 478 } \ 479 } while(0) 480@@ -247,6 +296,10 @@ enum ndr_compression_alg { 481 ndr->offset = (ndr->offset + (n-1)) & ~(n-1); \ 482 } \ 483 if (unlikely(ndr->offset > ndr->data_size)) { \ 484+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \ 485+ uint32_t _missing = ndr->offset - ndr->data_size; \ 486+ ndr->relative_highest_offset = _missing; \ 487+ } \ 488 return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull align %u", (unsigned)n); \ 489 } \ 490 } while(0) 491@@ -402,6 +455,8 @@ void ndr_print_dom_sid0(struct ndr_print 492 size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags); 493 void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid); 494 bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2); 495+char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id); 496+bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id); 497 enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, const void *p, ndr_push_flags_fn_t fn); 498 enum ndr_err_code ndr_push_union_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, uint32_t level, ndr_push_flags_fn_t fn); 499 size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push); 500@@ -424,14 +479,18 @@ enum ndr_err_code ndr_pull_relative_ptr2 501 enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v); 502 size_t ndr_align_size(uint32_t offset, size_t n); 503 struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx); 504+enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob); 505+enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr); 506 enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size); 507 struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx); 508 DATA_BLOB ndr_push_blob(struct ndr_push *ndr); 509 enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size); 510 void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3); 511+void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3); 512 void ndr_print_printf_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3); 513 void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3); 514 void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr); 515+void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr); 516 void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr); 517 void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr); 518 char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr); 519--- a/librpc/ndr/ndr.c 520+++ b/librpc/ndr/ndr.c 521@@ -77,6 +77,111 @@ _PUBLIC_ struct ndr_pull *ndr_pull_init_ 522 return ndr; 523 } 524 525+_PUBLIC_ enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob) 526+{ 527+ enum ndr_err_code ndr_err; 528+ DATA_BLOB b; 529+ uint32_t append = 0; 530+ bool ok; 531+ 532+ if (blob->length == 0) { 533+ return NDR_ERR_SUCCESS; 534+ } 535+ 536+ ndr_err = ndr_token_retrieve(&ndr->array_size_list, ndr, &append); 537+ if (ndr_err == NDR_ERR_TOKEN) { 538+ append = 0; 539+ ndr_err = NDR_ERR_SUCCESS; 540+ } 541+ NDR_CHECK(ndr_err); 542+ 543+ if (ndr->data_size == 0) { 544+ ndr->data = NULL; 545+ append = UINT32_MAX; 546+ } 547+ 548+ if (append == UINT32_MAX) { 549+ /* 550+ * append == UINT32_MAX means that 551+ * ndr->data is either NULL or a valid 552+ * talloc child of ndr, which means 553+ * we can use data_blob_append() without 554+ * data_blob_talloc() of the existing callers data 555+ */ 556+ b = data_blob_const(ndr->data, ndr->data_size); 557+ } else { 558+ b = data_blob_talloc(ndr, ndr->data, ndr->data_size); 559+ if (b.data == NULL) { 560+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__); 561+ } 562+ } 563+ 564+ ok = data_blob_append(ndr, &b, blob->data, blob->length); 565+ if (!ok) { 566+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__); 567+ } 568+ 569+ ndr->data = b.data; 570+ ndr->data_size = b.length; 571+ 572+ return ndr_token_store(ndr, &ndr->array_size_list, ndr, UINT32_MAX); 573+} 574+ 575+_PUBLIC_ enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr) 576+{ 577+ uint32_t skip = 0; 578+ uint32_t append = 0; 579+ 580+ if (ndr->relative_base_offset != 0) { 581+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE, 582+ "%s", __location__); 583+ } 584+ if (ndr->relative_highest_offset != 0) { 585+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE, 586+ "%s", __location__); 587+ } 588+ if (ndr->relative_list != NULL) { 589+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE, 590+ "%s", __location__); 591+ } 592+ if (ndr->relative_base_list != NULL) { 593+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE, 594+ "%s", __location__); 595+ } 596+ 597+ /* 598+ * we need to keep up to 7 bytes 599+ * in order to get the aligment right. 600+ */ 601+ skip = ndr->offset & 0xFFFFFFF8; 602+ 603+ if (skip == 0) { 604+ return NDR_ERR_SUCCESS; 605+ } 606+ 607+ ndr->offset -= skip; 608+ ndr->data_size -= skip; 609+ 610+ append = ndr_token_peek(&ndr->array_size_list, ndr); 611+ if (append != UINT32_MAX) { 612+ /* 613+ * here we assume, that ndr->data is not a 614+ * talloc child of ndr. 615+ */ 616+ ndr->data += skip; 617+ return NDR_ERR_SUCCESS; 618+ } 619+ 620+ memmove(ndr->data, ndr->data + skip, ndr->data_size); 621+ 622+ ndr->data = talloc_realloc(ndr, ndr->data, uint8_t, ndr->data_size); 623+ if (ndr->data_size != 0 && ndr->data == NULL) { 624+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__); 625+ } 626+ 627+ return NDR_ERR_SUCCESS; 628+} 629+ 630 /* 631 advance by 'size' bytes 632 */ 633@@ -167,6 +272,38 @@ _PUBLIC_ enum ndr_err_code ndr_push_expa 634 return NDR_ERR_SUCCESS; 635 } 636 637+_PUBLIC_ void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...) 638+{ 639+ va_list ap; 640+ char *s = NULL; 641+ uint32_t i; 642+ int ret; 643+ int dbgc_class; 644+ 645+ va_start(ap, format); 646+ ret = vasprintf(&s, format, ap); 647+ va_end(ap); 648+ 649+ if (ret == -1) { 650+ return; 651+ } 652+ 653+ dbgc_class = *(int *)ndr->private_data; 654+ 655+ if (ndr->no_newline) { 656+ DEBUGADDC(dbgc_class, 1,("%s", s)); 657+ free(s); 658+ return; 659+ } 660+ 661+ for (i=0;i<ndr->depth;i++) { 662+ DEBUGADDC(dbgc_class, 1,(" ")); 663+ } 664+ 665+ DEBUGADDC(dbgc_class, 1,("%s\n", s)); 666+ free(s); 667+} 668+ 669 _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) 670 { 671 va_list ap; 672@@ -238,6 +375,25 @@ _PUBLIC_ void ndr_print_string_helper(st 673 } 674 675 /* 676+ a useful helper function for printing idl structures via DEBUGC() 677+*/ 678+_PUBLIC_ void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr) 679+{ 680+ struct ndr_print *ndr; 681+ 682+ DEBUGC(dbgc_class, 1,(" ")); 683+ 684+ ndr = talloc_zero(NULL, struct ndr_print); 685+ if (!ndr) return; 686+ ndr->private_data = &dbgc_class; 687+ ndr->print = ndr_print_debugc_helper; 688+ ndr->depth = 1; 689+ ndr->flags = 0; 690+ fn(ndr, name, ptr); 691+ talloc_free(ndr); 692+} 693+ 694+/* 695 a useful helper function for printing idl structures via DEBUG() 696 */ 697 _PUBLIC_ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr) 698@@ -403,6 +559,15 @@ _PUBLIC_ enum ndr_err_code ndr_pull_erro 699 va_list ap; 700 int ret; 701 702+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { 703+ switch (ndr_err) { 704+ case NDR_ERR_BUFSIZE: 705+ return NDR_ERR_INCOMPLETE_BUFFER; 706+ default: 707+ break; 708+ } 709+ } 710+ 711 va_start(ap, format); 712 ret = vasprintf(&s, format, ap); 713 va_end(ap); 714@@ -557,6 +722,23 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc 715 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved)); 716 break; 717 } 718+ case 0xFFFFFFFF: 719+ /* 720+ * a shallow copy like subcontext 721+ * useful for DCERPC pipe chunks. 722+ */ 723+ subndr = talloc_zero(ndr, struct ndr_pull); 724+ NDR_ERR_HAVE_NO_MEMORY(subndr); 725+ 726+ subndr->flags = ndr->flags; 727+ subndr->current_mem_ctx = ndr->current_mem_ctx; 728+ subndr->data = ndr->data; 729+ subndr->offset = ndr->offset; 730+ subndr->data_size = ndr->data_size; 731+ 732+ *_subndr = subndr; 733+ return NDR_ERR_SUCCESS; 734+ 735 default: 736 return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", 737 (int)header_size); 738@@ -589,13 +771,35 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc 739 ssize_t size_is) 740 { 741 uint32_t advance; 742- if (size_is >= 0) { 743+ uint32_t highest_ofs; 744+ 745+ if (header_size == 0xFFFFFFFF) { 746+ advance = subndr->offset - ndr->offset; 747+ } else if (size_is >= 0) { 748 advance = size_is; 749 } else if (header_size > 0) { 750 advance = subndr->data_size; 751 } else { 752 advance = subndr->offset; 753 } 754+ 755+ if (subndr->offset > ndr->relative_highest_offset) { 756+ highest_ofs = subndr->offset; 757+ } else { 758+ highest_ofs = subndr->relative_highest_offset; 759+ } 760+ if (!(subndr->flags & LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES)) { 761+ /* 762+ * avoid an error unless SUBCONTEXT_NO_UNREAD_BYTES is specified 763+ */ 764+ highest_ofs = advance; 765+ } 766+ if (highest_ofs < advance) { 767+ return ndr_pull_error(subndr, NDR_ERR_UNREAD_BYTES, 768+ "not all bytes consumed ofs[%u] advance[%u]", 769+ highest_ofs, advance); 770+ } 771+ 772 NDR_CHECK(ndr_pull_advance(ndr, advance)); 773 return NDR_ERR_SUCCESS; 774 } 775@@ -1440,6 +1644,7 @@ const static struct { 776 { NDR_ERR_INVALID_POINTER, "Invalid Pointer" }, 777 { NDR_ERR_UNREAD_BYTES, "Unread Bytes" }, 778 { NDR_ERR_NDR64, "NDR64 assertion error" }, 779+ { NDR_ERR_INCOMPLETE_BUFFER, "Incomplete Buffer" }, 780 { 0, NULL } 781 }; 782 783--- a/librpc/idl/idl_types.h 784+++ b/librpc/idl/idl_types.h 785@@ -47,3 +47,5 @@ 786 787 #define NDR_RELATIVE_REVERSE LIBNDR_FLAG_RELATIVE_REVERSE 788 #define NDR_NO_RELATIVE_REVERSE LIBNDR_FLAG_NO_RELATIVE_REVERSE 789+ 790+#define NDR_SUBCONTEXT_NO_UNREAD_BYTES LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES 791--- a/librpc/idl/dcerpc.idl 792+++ b/librpc/idl/dcerpc.idl 793@@ -10,6 +10,8 @@ 794 */ 795 import "misc.idl"; 796 797+cpp_quote("extern const uint8_t DCERPC_SEC_VT_MAGIC[8];") 798+ 799 interface dcerpc 800 { 801 typedef struct { 802@@ -453,14 +455,21 @@ interface dcerpc 803 } dcerpc_payload; 804 805 /* pfc_flags values */ 806- const uint8 DCERPC_PFC_FLAG_FIRST = 0x01; /* First fragment */ 807- const uint8 DCERPC_PFC_FLAG_LAST = 0x02; /* Last fragment */ 808- const uint8 DCERPC_PFC_FLAG_PENDING_CANCEL = 0x04; /* Cancel was pending at sender */ 809- const uint8 DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = DCERPC_PFC_FLAG_PENDING_CANCEL; /* depends on the pdu type */ 810- const uint8 DCERPC_PFC_FLAG_CONC_MPX = 0x10; /* supports concurrent multiplexing of a single connection. */ 811- const uint8 DCERPC_PFC_FLAG_DID_NOT_EXECUTE = 0x20; /* on a fault it means the server hasn't done anything */ 812- const uint8 DCERPC_PFC_FLAG_MAYBE = 0x40; /* `maybe' call semantics requested */ 813- const uint8 DCERPC_PFC_FLAG_OBJECT_UUID = 0x80; /* on valid guid is in the optional object field */ 814+ typedef [bitmap8bit] bitmap { 815+ DCERPC_PFC_FLAG_FIRST = 0x01, /* First fragment */ 816+ DCERPC_PFC_FLAG_LAST = 0x02, /* Last fragment */ 817+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING = 0x04, /* depends on the pdu type */ 818+ DCERPC_PFC_FLAG_CONC_MPX = 0x10, /* supports concurrent multiplexing of a single connection. */ 819+ DCERPC_PFC_FLAG_DID_NOT_EXECUTE = 0x20, /* on a fault it means the server hasn't done anything */ 820+ DCERPC_PFC_FLAG_MAYBE = 0x40, /* `maybe' call semantics requested */ 821+ DCERPC_PFC_FLAG_OBJECT_UUID = 0x80 /* on valid guid is in the optional object field */ 822+ } dcerpc_pfc_flags; 823+ 824+ /* Cancel was pending at sender */ 825+ const int DCERPC_PFC_FLAG_PENDING_CANCEL = 826+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING; 827+ const ist DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = 828+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING; 829 830 /* these offsets are needed by the signing code */ 831 const uint8 DCERPC_PFC_OFFSET = 3; 832@@ -468,6 +477,7 @@ interface dcerpc 833 const uint8 DCERPC_FRAG_LEN_OFFSET = 8; 834 const uint8 DCERPC_AUTH_LEN_OFFSET = 10; 835 const uint8 DCERPC_CALL_ID_OFFSET = 12; 836+ const uint8 DCERPC_NCACN_PAYLOAD_OFFSET = 16; 837 838 /* little-endian flag */ 839 const uint8 DCERPC_DREP_LE = 0x10; 840@@ -476,7 +486,7 @@ interface dcerpc 841 uint8 rpc_vers; /* RPC version */ 842 uint8 rpc_vers_minor; /* Minor version */ 843 dcerpc_pkt_type ptype; /* Packet type */ 844- uint8 pfc_flags; /* Fragmentation flags */ 845+ dcerpc_pfc_flags pfc_flags; /* Fragmentation flags */ 846 uint8 drep[4]; /* NDR data representation */ 847 uint16 frag_length; /* Total length of fragment */ 848 uint16 auth_length; /* authenticator length */ 849@@ -506,4 +516,69 @@ interface dcerpc 850 uint8 serial_low; 851 [switch_is(ptype)] dcerpc_payload u; 852 } ncadg_packet; 853+ 854+ typedef [bitmap16bit] bitmap { 855+ DCERPC_SEC_VT_COMMAND_ENUM = 0x3FFF, 856+ DCERPC_SEC_VT_COMMAND_END = 0x4000, 857+ DCERPC_SEC_VT_MUST_PROCESS = 0x8000 858+ } dcerpc_sec_vt_command; 859+ 860+ typedef [enum16bit] enum { 861+ DCERPC_SEC_VT_COMMAND_BITMASK1 = 0x0001, 862+ DCERPC_SEC_VT_COMMAND_PCONTEXT = 0x0002, 863+ DCERPC_SEC_VT_COMMAND_HEADER2 = 0x0003 864+ } dcerpc_sec_vt_command_enum; 865+ 866+ typedef [bitmap32bit] bitmap { 867+ DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING = 0x00000001 868+ } dcerpc_sec_vt_bitmask1; 869+ 870+ typedef struct { 871+ ndr_syntax_id abstract_syntax; 872+ ndr_syntax_id transfer_syntax; 873+ } dcerpc_sec_vt_pcontext; 874+ 875+ typedef struct { 876+ dcerpc_pkt_type ptype; /* Packet type */ 877+ [value(0)] uint8 reserved1; 878+ [value(0)] uint16 reserved2; 879+ uint8 drep[4]; /* NDR data representation */ 880+ uint32 call_id; /* Call identifier */ 881+ uint16 context_id; 882+ uint16 opnum; 883+ } dcerpc_sec_vt_header2; 884+ 885+ typedef [switch_type(dcerpc_sec_vt_command_enum),nodiscriminant] union { 886+ [case(DCERPC_SEC_VT_COMMAND_BITMASK1)] dcerpc_sec_vt_bitmask1 bitmask1; 887+ [case(DCERPC_SEC_VT_COMMAND_PCONTEXT)] dcerpc_sec_vt_pcontext pcontext; 888+ [case(DCERPC_SEC_VT_COMMAND_HEADER2)] dcerpc_sec_vt_header2 header2; 889+ [default,flag(NDR_REMAINING)] DATA_BLOB _unknown; 890+ } dcerpc_sec_vt_union; 891+ 892+ typedef struct { 893+ dcerpc_sec_vt_command command; 894+ [switch_is(command & DCERPC_SEC_VT_COMMAND_ENUM)] 895+ [subcontext(2),flag(NDR_SUBCONTEXT_NO_UNREAD_BYTES)] 896+ dcerpc_sec_vt_union u; 897+ } dcerpc_sec_vt; 898+ 899+ typedef [public,nopush,nopull] struct { 900+ uint16 count; 901+ } dcerpc_sec_vt_count; 902+ 903+ /* 904+ * We assume that the whole verification trailer fits into 905+ * the last 1024 bytes after the stub data. 906+ * 907+ * There're currently only 3 commands defined and each should 908+ * only be used once. 909+ */ 910+ const uint16 DCERPC_SEC_VT_MAX_SIZE = 1024; 911+ 912+ typedef [public,flag(NDR_PAHEX)] struct { 913+ [flag(NDR_ALIGN4)] DATA_BLOB _pad; 914+ [value(DCERPC_SEC_VT_MAGIC)] uint8 magic[8]; 915+ dcerpc_sec_vt_count count; 916+ dcerpc_sec_vt commands[count.count]; 917+ } dcerpc_sec_verification_trailer; 918 } 919--- /dev/null 920+++ b/librpc/ndr/ndr_dcerpc.c 921@@ -0,0 +1,187 @@ 922+/* 923+ Unix SMB/CIFS implementation. 924+ 925+ Manually parsed structures found in the DCERPC protocol 926+ 927+ Copyright (C) Stefan Metzmacher 2014 928+ Copyright (C) Gregor Beck 2014 929+ 930+ This program is free software; you can redistribute it and/or modify 931+ it under the terms of the GNU General Public License as published by 932+ the Free Software Foundation; either version 3 of the License, or 933+ (at your option) any later version. 934+ 935+ This program is distributed in the hope that it will be useful, 936+ but WITHOUT ANY WARRANTY; without even the implied warranty of 937+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 938+ GNU General Public License for more details. 939+ 940+ You should have received a copy of the GNU General Public License 941+ along with this program. If not, see <http://www.gnu.org/licenses/>. 942+*/ 943+ 944+#include "includes.h" 945+#include "librpc/gen_ndr/ndr_dcerpc.h" 946+ 947+#include "librpc/gen_ndr/ndr_misc.h" 948+#include "lib/util/bitmap.h" 949+ 950+const uint8_t DCERPC_SEC_VT_MAGIC[] = {0x8a,0xe3,0x13,0x71,0x02,0xf4,0x36,0x71}; 951+ 952+_PUBLIC_ enum ndr_err_code ndr_push_dcerpc_sec_vt_count(struct ndr_push *ndr, int ndr_flags, const struct dcerpc_sec_vt_count *r) 953+{ 954+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 955+ /* nothing */ 956+ return NDR_ERR_SUCCESS; 957+} 958+ 959+_PUBLIC_ enum ndr_err_code ndr_pull_dcerpc_sec_vt_count(struct ndr_pull *ndr, int ndr_flags, struct dcerpc_sec_vt_count *r) 960+{ 961+ uint32_t _saved_ofs = ndr->offset; 962+ 963+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 964+ 965+ if (!(ndr_flags & NDR_SCALARS)) { 966+ return NDR_ERR_SUCCESS; 967+ } 968+ 969+ r->count = 0; 970+ 971+ while (true) { 972+ uint16_t command; 973+ uint16_t length; 974+ 975+ NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &command)); 976+ NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &length)); 977+ NDR_CHECK(ndr_pull_advance(ndr, length)); 978+ 979+ r->count += 1; 980+ 981+ if (command & DCERPC_SEC_VT_COMMAND_END) { 982+ break; 983+ } 984+ } 985+ 986+ ndr->offset = _saved_ofs; 987+ return NDR_ERR_SUCCESS; 988+} 989+ 990+_PUBLIC_ enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer( 991+ struct ndr_pull *ndr, TALLOC_CTX *mem_ctx, 992+ struct dcerpc_sec_verification_trailer **_r) 993+{ 994+ enum ndr_err_code ndr_err; 995+ uint32_t ofs; 996+ uint32_t min_ofs = 0; 997+ struct dcerpc_sec_verification_trailer *r; 998+ DATA_BLOB sub_blob = data_blob_null; 999+ struct ndr_pull *sub_ndr = NULL; 1000+ uint32_t remaining; 1001+ 1002+ *_r = NULL; 1003+ 1004+ r = talloc_zero(mem_ctx, struct dcerpc_sec_verification_trailer); 1005+ if (r == NULL) { 1006+ return NDR_ERR_ALLOC; 1007+ } 1008+ 1009+ if (ndr->data_size < sizeof(DCERPC_SEC_VT_MAGIC)) { 1010+ /* 1011+ * we return with r->count = 0 1012+ */ 1013+ *_r = r; 1014+ return NDR_ERR_SUCCESS; 1015+ } 1016+ 1017+ ofs = ndr->data_size - sizeof(DCERPC_SEC_VT_MAGIC); 1018+ /* the magic is 4 byte aligned */ 1019+ ofs &= ~3; 1020+ 1021+ if (ofs > DCERPC_SEC_VT_MAX_SIZE) { 1022+ /* 1023+ * We just scan the last 1024 bytes. 1024+ */ 1025+ min_ofs = ofs - DCERPC_SEC_VT_MAX_SIZE; 1026+ } else { 1027+ min_ofs = 0; 1028+ } 1029+ 1030+ while (true) { 1031+ int ret; 1032+ 1033+ ret = memcmp(&ndr->data[ofs], 1034+ DCERPC_SEC_VT_MAGIC, 1035+ sizeof(DCERPC_SEC_VT_MAGIC)); 1036+ if (ret == 0) { 1037+ sub_blob = data_blob_const(&ndr->data[ofs], 1038+ ndr->data_size - ofs); 1039+ break; 1040+ } 1041+ 1042+ if (ofs <= min_ofs) { 1043+ break; 1044+ } 1045+ 1046+ ofs -= 4; 1047+ } 1048+ 1049+ if (sub_blob.length == 0) { 1050+ /* 1051+ * we return with r->count = 0 1052+ */ 1053+ *_r = r; 1054+ return NDR_ERR_SUCCESS; 1055+ } 1056+ 1057+ sub_ndr = ndr_pull_init_blob(&sub_blob, r); 1058+ if (sub_ndr == NULL) { 1059+ TALLOC_FREE(r); 1060+ return NDR_ERR_ALLOC; 1061+ } 1062+ 1063+ ndr_err = ndr_pull_dcerpc_sec_verification_trailer(sub_ndr, 1064+ NDR_SCALARS | NDR_BUFFERS, 1065+ r); 1066+ if (ndr_err == NDR_ERR_ALLOC) { 1067+ TALLOC_FREE(r); 1068+ return NDR_ERR_ALLOC; 1069+ } 1070+ 1071+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 1072+ goto ignore_error; 1073+ } 1074+ 1075+ remaining = sub_ndr->data_size - sub_ndr->offset; 1076+ if (remaining > 16) { 1077+ /* 1078+ * we expect not more than 16 byte of additional 1079+ * padding after the verification trailer. 1080+ */ 1081+ goto ignore_error; 1082+ } 1083+ 1084+ /* 1085+ * We assume that we got a real verification trailer. 1086+ * 1087+ * We remove it from the available stub data. 1088+ */ 1089+ ndr->data_size = ofs; 1090+ 1091+ TALLOC_FREE(sub_ndr); 1092+ 1093+ *_r = r; 1094+ return NDR_ERR_SUCCESS; 1095+ 1096+ignore_error: 1097+ TALLOC_FREE(sub_ndr); 1098+ /* 1099+ * just ignore the error, it's likely 1100+ * that the magic we found belongs to 1101+ * the stub data. 1102+ * 1103+ * we return with r->count = 0 1104+ */ 1105+ ZERO_STRUCTP(r); 1106+ *_r = r; 1107+ return NDR_ERR_SUCCESS; 1108+} 1109--- a/librpc/wscript_build 1110+++ b/librpc/wscript_build 1111@@ -274,8 +274,9 @@ bld.SAMBA_SUBSYSTEM('NDR_COMPRESSION', 1112 ) 1113 1114 bld.SAMBA_SUBSYSTEM('NDR_DCERPC', 1115- source='gen_ndr/ndr_dcerpc.c', 1116+ source='gen_ndr/ndr_dcerpc.c ndr/ndr_dcerpc.c', 1117 public_deps='ndr', 1118+ deps='bitmap', 1119 public_headers='gen_ndr/ndr_dcerpc.h gen_ndr/dcerpc.h', 1120 header_path= [ ('*gen_ndr*', 'gen_ndr') ], 1121 ) 1122--- a/source3/Makefile.in 1123+++ b/source3/Makefile.in 1124@@ -323,7 +323,8 @@ LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \ 1125 ../librpc/ndr/uuid.o \ 1126 librpc/ndr/util.o \ 1127 librpc/gen_ndr/ndr_server_id.o \ 1128- librpc/gen_ndr/ndr_dcerpc.o 1129+ librpc/gen_ndr/ndr_dcerpc.o \ 1130+ ../librpc/ndr/ndr_dcerpc.o 1131 1132 LIBNDR_GEN_OBJ0 = librpc/gen_ndr/ndr_samr.o \ 1133 librpc/gen_ndr/ndr_lsa.o 1134@@ -454,7 +455,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ 1135 lib/username.o \ 1136 ../libds/common/flag_mapping.o \ 1137 lib/access.o lib/smbrun.o \ 1138- lib/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \ 1139+ ../lib/util/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \ 1140 lib/wins_srv.o \ 1141 lib/util_str.o lib/clobber.o lib/util_sid.o \ 1142 lib/util_unistr.o ../lib/util/charset/codepoints.o lib/util_file.o \ 1143@@ -987,7 +988,9 @@ SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(P 1144 $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \ 1145 $(PASSCHANGE_OBJ) $(FNAME_UTIL_OBJ) \ 1146 $(LIBCLI_SAMR_OBJ) \ 1147- rpc_client/init_lsa.o 1148+ $(LIBCLI_NETLOGON_OBJ) \ 1149+ rpc_client/init_lsa.o \ 1150+ rpc_client/init_netlogon.o 1151 1152 STATUS_OBJ = utils/status.o utils/status_profile.o \ 1153 $(LOCKING_OBJ) $(PARAM_OBJ) \ 1154@@ -1003,7 +1006,9 @@ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OB 1155 $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \ 1156 $(LIBMSRPC_GEN_OBJ) \ 1157 $(LIBMSRPC_OBJ) \ 1158- $(LIBCLI_SRVSVC_OBJ) 1159+ $(LIBCLI_SRVSVC_OBJ) \ 1160+ $(LIBCLI_NETLOGON_OBJ) \ 1161+ rpc_client/init_netlogon.o 1162 1163 TESTPARM_OBJ = utils/testparm.o \ 1164 $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \ 1165@@ -1025,7 +1030,9 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASS 1166 $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \ 1167 $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \ 1168 $(LIBCLI_SAMR_OBJ) \ 1169- rpc_client/init_lsa.o 1170+ $(LIBCLI_NETLOGON_OBJ) \ 1171+ rpc_client/init_lsa.o \ 1172+ rpc_client/init_netlogon.o 1173 1174 PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \ 1175 $(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \ 1176@@ -1098,7 +1105,9 @@ LIBSMBCLIENT_OBJ1 = $(LIBSMBCLIENT_OBJ0) 1177 $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \ 1178 $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \ 1179 $(LIBCLI_SRVSVC_OBJ) \ 1180- $(LIBCLI_LSA_OBJ) 1181+ $(LIBCLI_LSA_OBJ) \ 1182+ $(LIBCLI_NETLOGON_OBJ) \ 1183+ rpc_client/init_netlogon.o 1184 1185 LIBSMBCLIENT_OBJ = $(LIBSMBCLIENT_OBJ1) 1186 1187@@ -1121,7 +1130,9 @@ CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ) 1188 $(READLINE_OBJ) $(POPT_LIB_OBJ) \ 1189 $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \ 1190 $(DISPLAY_SEC_OBJ) \ 1191- $(LIBCLI_SRVSVC_OBJ) 1192+ $(LIBCLI_SRVSVC_OBJ) \ 1193+ $(LIBCLI_NETLOGON_OBJ) \ 1194+ rpc_client/init_netlogon.o 1195 1196 LIBSMBCONF_OBJ = ../lib/smbconf/smbconf.o \ 1197 ../lib/smbconf/smbconf_util.o \ 1198@@ -1233,7 +1244,9 @@ SMBTORTURE_OBJ = $(SMBTORTURE_OBJ1) $(PA 1199 @LIBWBCLIENT_STATIC@ \ 1200 torture/wbc_async.o \ 1201 ../nsswitch/wb_reqtrans.o \ 1202- $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ) 1203+ $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ) \ 1204+ $(LIBCLI_NETLOGON_OBJ) rpc_client/init_netlogon.o 1205+ 1206 1207 MASKTEST_OBJ = torture/masktest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \ 1208 $(LIB_NONSMBD_OBJ) \ 1209@@ -1268,14 +1281,18 @@ SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_ 1210 $(KRBCLIENT_OBJ) $(LIB_NONSMBD_OBJ) \ 1211 $(PASSDB_OBJ) $(GROUPDB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \ 1212 $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \ 1213- $(LIBCLI_LSA_OBJ) 1214+ $(LIBCLI_LSA_OBJ) \ 1215+ $(LIBCLI_NETLOGON_OBJ) \ 1216+ rpc_client/init_netlogon.o 1217 1218 SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \ 1219 $(PARAM_OBJ) \ 1220 $(LIB_NONSMBD_OBJ) \ 1221 $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(POPT_LIB_OBJ) \ 1222 $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \ 1223- $(LIBCLI_LSA_OBJ) 1224+ $(LIBCLI_LSA_OBJ) \ 1225+ $(LIBCLI_NETLOGON_OBJ) \ 1226+ rpc_client/init_netlogon.o 1227 1228 EVTLOGADM_OBJ0 = utils/eventlogadm.o 1229 1230--- a/librpc/ndr/ndr_basic.c 1231+++ b/librpc/ndr/ndr_basic.c 1232@@ -61,6 +61,7 @@ _PUBLIC_ void ndr_check_padding(struct n 1233 */ 1234 _PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v) 1235 { 1236+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1237 NDR_PULL_NEED_BYTES(ndr, 1); 1238 *v = (int8_t)CVAL(ndr->data, ndr->offset); 1239 ndr->offset += 1; 1240@@ -72,6 +73,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int8 1241 */ 1242 _PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v) 1243 { 1244+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1245 NDR_PULL_NEED_BYTES(ndr, 1); 1246 *v = CVAL(ndr->data, ndr->offset); 1247 ndr->offset += 1; 1248@@ -83,6 +85,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint 1249 */ 1250 _PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v) 1251 { 1252+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1253 NDR_PULL_ALIGN(ndr, 2); 1254 NDR_PULL_NEED_BYTES(ndr, 2); 1255 *v = (uint16_t)NDR_SVAL(ndr, ndr->offset); 1256@@ -95,6 +98,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int1 1257 */ 1258 _PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v) 1259 { 1260+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1261 NDR_PULL_ALIGN(ndr, 2); 1262 NDR_PULL_NEED_BYTES(ndr, 2); 1263 *v = NDR_SVAL(ndr, ndr->offset); 1264@@ -107,6 +111,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint 1265 */ 1266 _PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, int ndr_flags, uint16_t *v) 1267 { 1268+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1269 if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) { 1270 uint32_t v32 = 0; 1271 enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32); 1272@@ -125,6 +130,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint 1273 */ 1274 _PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v) 1275 { 1276+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1277 NDR_PULL_ALIGN(ndr, 4); 1278 NDR_PULL_NEED_BYTES(ndr, 4); 1279 *v = NDR_IVALS(ndr, ndr->offset); 1280@@ -137,6 +143,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int3 1281 */ 1282 _PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v) 1283 { 1284+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1285 NDR_PULL_ALIGN(ndr, 4); 1286 NDR_PULL_NEED_BYTES(ndr, 4); 1287 *v = NDR_IVAL(ndr, ndr->offset); 1288@@ -151,6 +158,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint 1289 { 1290 uint64_t v64; 1291 enum ndr_err_code err; 1292+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1293 if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) { 1294 return ndr_pull_uint32(ndr, ndr_flags, v); 1295 } 1296@@ -169,6 +177,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint 1297 */ 1298 _PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, int ndr_flags, double *v) 1299 { 1300+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1301 NDR_PULL_ALIGN(ndr, 8); 1302 NDR_PULL_NEED_BYTES(ndr, 8); 1303 memcpy(v, ndr->data+ndr->offset, 8); 1304@@ -217,6 +226,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ref_ 1305 */ 1306 _PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v) 1307 { 1308+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1309 NDR_PULL_ALIGN(ndr, 4); 1310 NDR_PULL_NEED_BYTES(ndr, 8); 1311 *v = NDR_IVAL(ndr, ndr->offset); 1312@@ -230,6 +240,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_udlo 1313 */ 1314 _PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v) 1315 { 1316+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1317 NDR_PULL_ALIGN(ndr, 4); 1318 NDR_PULL_NEED_BYTES(ndr, 8); 1319 *v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32; 1320@@ -264,6 +275,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_hype 1321 _PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v) 1322 { 1323 uintptr_t h; 1324+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1325 NDR_PULL_ALIGN(ndr, sizeof(h)); 1326 NDR_PULL_NEED_BYTES(ndr, sizeof(h)); 1327 memcpy(&h, ndr->data+ndr->offset, sizeof(h)); 1328@@ -278,6 +290,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_poin 1329 _PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status) 1330 { 1331 uint32_t v; 1332+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1333 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v)); 1334 *status = NT_STATUS(v); 1335 return NDR_ERR_SUCCESS; 1336@@ -302,6 +315,7 @@ _PUBLIC_ void ndr_print_NTSTATUS(struct 1337 _PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status) 1338 { 1339 uint32_t v; 1340+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1341 NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v)); 1342 *status = W_ERROR(v); 1343 return NDR_ERR_SUCCESS; 1344@@ -414,6 +428,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_byte 1345 */ 1346 _PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n) 1347 { 1348+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1349 if (!(ndr_flags & NDR_SCALARS)) { 1350 return NDR_ERR_SUCCESS; 1351 } 1352@@ -425,6 +440,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_arra 1353 */ 1354 _PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v) 1355 { 1356+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1357 NDR_PUSH_NEED_BYTES(ndr, 1); 1358 SCVAL(ndr->data, ndr->offset, (uint8_t)v); 1359 ndr->offset += 1; 1360@@ -436,6 +452,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int8 1361 */ 1362 _PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v) 1363 { 1364+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1365 NDR_PUSH_NEED_BYTES(ndr, 1); 1366 SCVAL(ndr->data, ndr->offset, v); 1367 ndr->offset += 1; 1368@@ -447,6 +464,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint 1369 */ 1370 _PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v) 1371 { 1372+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1373 NDR_PUSH_ALIGN(ndr, 2); 1374 NDR_PUSH_NEED_BYTES(ndr, 2); 1375 NDR_SSVAL(ndr, ndr->offset, (uint16_t)v); 1376@@ -459,6 +477,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int1 1377 */ 1378 _PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v) 1379 { 1380+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1381 NDR_PUSH_ALIGN(ndr, 2); 1382 NDR_PUSH_NEED_BYTES(ndr, 2); 1383 NDR_SSVAL(ndr, ndr->offset, v); 1384@@ -482,6 +501,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint 1385 */ 1386 _PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v) 1387 { 1388+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1389 NDR_PUSH_ALIGN(ndr, 4); 1390 NDR_PUSH_NEED_BYTES(ndr, 4); 1391 NDR_SIVALS(ndr, ndr->offset, v); 1392@@ -494,6 +514,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int3 1393 */ 1394 _PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v) 1395 { 1396+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1397 NDR_PUSH_ALIGN(ndr, 4); 1398 NDR_PUSH_NEED_BYTES(ndr, 4); 1399 NDR_SIVAL(ndr, ndr->offset, v); 1400@@ -517,6 +538,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint 1401 */ 1402 _PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v) 1403 { 1404+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1405 NDR_PUSH_ALIGN(ndr, 4); 1406 NDR_PUSH_NEED_BYTES(ndr, 8); 1407 NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF)); 1408@@ -530,6 +552,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_udlo 1409 */ 1410 _PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v) 1411 { 1412+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1413 NDR_PUSH_ALIGN(ndr, 4); 1414 NDR_PUSH_NEED_BYTES(ndr, 8); 1415 NDR_SIVAL(ndr, ndr->offset, (v>>32)); 1416@@ -563,6 +586,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_hype 1417 */ 1418 _PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, int ndr_flags, double v) 1419 { 1420+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1421 NDR_PUSH_ALIGN(ndr, 8); 1422 NDR_PUSH_NEED_BYTES(ndr, 8); 1423 memcpy(ndr->data+ndr->offset, &v, 8); 1424@@ -576,6 +600,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_doub 1425 _PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v) 1426 { 1427 uintptr_t h = (intptr_t)v; 1428+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1429 NDR_PUSH_ALIGN(ndr, sizeof(h)); 1430 NDR_PUSH_NEED_BYTES(ndr, sizeof(h)); 1431 memcpy(ndr->data+ndr->offset, &h, sizeof(h)); 1432@@ -686,6 +711,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_zero 1433 */ 1434 _PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n) 1435 { 1436+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1437 if (!(ndr_flags & NDR_SCALARS)) { 1438 return NDR_ERR_SUCCESS; 1439 } 1440@@ -738,6 +764,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_ref_ 1441 */ 1442 _PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t) 1443 { 1444+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1445 NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t)); 1446 return NDR_ERR_SUCCESS; 1447 } 1448@@ -747,6 +774,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI 1449 */ 1450 _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) 1451 { 1452+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1453 NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t)); 1454 return NDR_ERR_SUCCESS; 1455 } 1456@@ -756,6 +784,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI 1457 */ 1458 _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t) 1459 { 1460+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1461 t /= 10000000; 1462 NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t)); 1463 return NDR_ERR_SUCCESS; 1464@@ -766,6 +795,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI 1465 */ 1466 _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) 1467 { 1468+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1469 NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t)); 1470 (*t) *= 10000000; 1471 return NDR_ERR_SUCCESS; 1472@@ -776,6 +806,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI 1473 */ 1474 _PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t) 1475 { 1476+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); 1477 NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t)); 1478 return NDR_ERR_SUCCESS; 1479 } 1480@@ -785,6 +816,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI 1481 */ 1482 _PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t) 1483 { 1484+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1485 NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t)); 1486 return NDR_ERR_SUCCESS; 1487 } 1488@@ -814,6 +846,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_time 1489 */ 1490 _PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, int ndr_flags, uid_t u) 1491 { 1492+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1493 return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u); 1494 } 1495 1496@@ -839,6 +872,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uid_ 1497 */ 1498 _PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, int ndr_flags, gid_t g) 1499 { 1500+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); 1501 return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g); 1502 } 1503 1504--- a/source3/lib/bitmap.c 1505+++ /dev/null 1506@@ -1,136 +0,0 @@ 1507-/* 1508- Unix SMB/CIFS implementation. 1509- simple bitmap functions 1510- Copyright (C) Andrew Tridgell 1992-1998 1511- 1512- This program is free software; you can redistribute it and/or modify 1513- it under the terms of the GNU General Public License as published by 1514- the Free Software Foundation; either version 3 of the License, or 1515- (at your option) any later version. 1516- 1517- This program is distributed in the hope that it will be useful, 1518- but WITHOUT ANY WARRANTY; without even the implied warranty of 1519- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1520- GNU General Public License for more details. 1521- 1522- You should have received a copy of the GNU General Public License 1523- along with this program. If not, see <http://www.gnu.org/licenses/>. 1524-*/ 1525- 1526-#include "includes.h" 1527- 1528-/* these functions provide a simple way to allocate integers from a 1529- pool without repetition */ 1530- 1531-/**************************************************************************** 1532-talloc a bitmap 1533-****************************************************************************/ 1534-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n) 1535-{ 1536- struct bitmap *bm; 1537- 1538- bm = TALLOC_P(mem_ctx, struct bitmap); 1539- 1540- if (!bm) return NULL; 1541- 1542- bm->n = n; 1543- bm->b = TALLOC_ZERO_ARRAY(bm, uint32, (n+31)/32); 1544- if (!bm->b) { 1545- TALLOC_FREE(bm); 1546- return NULL; 1547- } 1548- return bm; 1549-} 1550- 1551-/**************************************************************************** 1552-copy as much of the source bitmap as will fit in the destination bitmap. 1553-****************************************************************************/ 1554- 1555-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src) 1556-{ 1557- int count = MIN(dst->n, src->n); 1558- 1559- SMB_ASSERT(dst->b != src->b); 1560- memcpy(dst->b, src->b, sizeof(uint32)*((count+31)/32)); 1561- 1562- return count; 1563-} 1564- 1565-/**************************************************************************** 1566-set a bit in a bitmap 1567-****************************************************************************/ 1568-bool bitmap_set(struct bitmap *bm, unsigned i) 1569-{ 1570- if (i >= bm->n) { 1571- DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n", 1572- i, bm->n)); 1573- return False; 1574- } 1575- bm->b[i/32] |= (1<<(i%32)); 1576- return True; 1577-} 1578- 1579-/**************************************************************************** 1580-clear a bit in a bitmap 1581-****************************************************************************/ 1582-bool bitmap_clear(struct bitmap *bm, unsigned i) 1583-{ 1584- if (i >= bm->n) { 1585- DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n", 1586- i, bm->n)); 1587- return False; 1588- } 1589- bm->b[i/32] &= ~(1<<(i%32)); 1590- return True; 1591-} 1592- 1593-/**************************************************************************** 1594-query a bit in a bitmap 1595-****************************************************************************/ 1596-bool bitmap_query(struct bitmap *bm, unsigned i) 1597-{ 1598- if (i >= bm->n) return False; 1599- if (bm->b[i/32] & (1<<(i%32))) { 1600- return True; 1601- } 1602- return False; 1603-} 1604- 1605-/**************************************************************************** 1606-find a zero bit in a bitmap starting at the specified offset, with 1607-wraparound 1608-****************************************************************************/ 1609-int bitmap_find(struct bitmap *bm, unsigned ofs) 1610-{ 1611- unsigned int i, j; 1612- 1613- if (ofs > bm->n) ofs = 0; 1614- 1615- i = ofs; 1616- while (i < bm->n) { 1617- if (~(bm->b[i/32])) { 1618- j = i; 1619- do { 1620- if (!bitmap_query(bm, j)) return j; 1621- j++; 1622- } while (j & 31 && j < bm->n); 1623- } 1624- i += 32; 1625- i &= ~31; 1626- } 1627- 1628- i = 0; 1629- while (i < ofs) { 1630- if (~(bm->b[i/32])) { 1631- j = i; 1632- do { 1633- if (!bitmap_query(bm, j)) return j; 1634- j++; 1635- } while (j & 31 && j < bm->n); 1636- } 1637- i += 32; 1638- i &= ~31; 1639- } 1640- 1641- return -1; 1642-} 1643--- /dev/null 1644+++ b/lib/util/bitmap.c 1645@@ -0,0 +1,137 @@ 1646+/* 1647+ Unix SMB/CIFS implementation. 1648+ simple bitmap functions 1649+ Copyright (C) Andrew Tridgell 1992-1998 1650+ 1651+ This program is free software; you can redistribute it and/or modify 1652+ it under the terms of the GNU General Public License as published by 1653+ the Free Software Foundation; either version 3 of the License, or 1654+ (at your option) any later version. 1655+ 1656+ This program is distributed in the hope that it will be useful, 1657+ but WITHOUT ANY WARRANTY; without even the implied warranty of 1658+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1659+ GNU General Public License for more details. 1660+ 1661+ You should have received a copy of the GNU General Public License 1662+ along with this program. If not, see <http://www.gnu.org/licenses/>. 1663+*/ 1664+ 1665+#include "includes.h" 1666+#include "lib/util/bitmap.h" 1667+ 1668+/* these functions provide a simple way to allocate integers from a 1669+ pool without repetition */ 1670+ 1671+/**************************************************************************** 1672+talloc a bitmap 1673+****************************************************************************/ 1674+struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n) 1675+{ 1676+ struct bitmap *bm; 1677+ 1678+ bm = talloc_zero(mem_ctx, struct bitmap); 1679+ 1680+ if (!bm) return NULL; 1681+ 1682+ bm->n = n; 1683+ bm->b = talloc_zero_array(bm, uint32_t, (n+31)/32); 1684+ if (!bm->b) { 1685+ TALLOC_FREE(bm); 1686+ return NULL; 1687+ } 1688+ return bm; 1689+} 1690+ 1691+/**************************************************************************** 1692+copy as much of the source bitmap as will fit in the destination bitmap. 1693+****************************************************************************/ 1694+ 1695+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src) 1696+{ 1697+ int count = MIN(dst->n, src->n); 1698+ 1699+ SMB_ASSERT(dst->b != src->b); 1700+ memcpy(dst->b, src->b, sizeof(uint32_t)*((count+31)/32)); 1701+ 1702+ return count; 1703+} 1704+ 1705+/**************************************************************************** 1706+set a bit in a bitmap 1707+****************************************************************************/ 1708+bool bitmap_set(struct bitmap *bm, unsigned i) 1709+{ 1710+ if (i >= bm->n) { 1711+ DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n", 1712+ i, bm->n)); 1713+ return false; 1714+ } 1715+ bm->b[i/32] |= (1<<(i%32)); 1716+ return true; 1717+} 1718+ 1719+/**************************************************************************** 1720+clear a bit in a bitmap 1721+****************************************************************************/ 1722+bool bitmap_clear(struct bitmap *bm, unsigned i) 1723+{ 1724+ if (i >= bm->n) { 1725+ DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n", 1726+ i, bm->n)); 1727+ return false; 1728+ } 1729+ bm->b[i/32] &= ~(1<<(i%32)); 1730+ return true; 1731+} 1732+ 1733+/**************************************************************************** 1734+query a bit in a bitmap 1735+****************************************************************************/ 1736+bool bitmap_query(struct bitmap *bm, unsigned i) 1737+{ 1738+ if (i >= bm->n) return false; 1739+ if (bm->b[i/32] & (1<<(i%32))) { 1740+ return true; 1741+ } 1742+ return false; 1743+} 1744+ 1745+/**************************************************************************** 1746+find a zero bit in a bitmap starting at the specified offset, with 1747+wraparound 1748+****************************************************************************/ 1749+int bitmap_find(struct bitmap *bm, unsigned ofs) 1750+{ 1751+ unsigned int i, j; 1752+ 1753+ if (ofs > bm->n) ofs = 0; 1754+ 1755+ i = ofs; 1756+ while (i < bm->n) { 1757+ if (~(bm->b[i/32])) { 1758+ j = i; 1759+ do { 1760+ if (!bitmap_query(bm, j)) return j; 1761+ j++; 1762+ } while (j & 31 && j < bm->n); 1763+ } 1764+ i += 32; 1765+ i &= ~31; 1766+ } 1767+ 1768+ i = 0; 1769+ while (i < ofs) { 1770+ if (~(bm->b[i/32])) { 1771+ j = i; 1772+ do { 1773+ if (!bitmap_query(bm, j)) return j; 1774+ j++; 1775+ } while (j & 31 && j < bm->n); 1776+ } 1777+ i += 32; 1778+ i &= ~31; 1779+ } 1780+ 1781+ return -1; 1782+} 1783--- /dev/null 1784+++ b/lib/util/bitmap.h 1785@@ -0,0 +1,32 @@ 1786+/* 1787+ Unix SMB/CIFS implementation. 1788+ simple bitmap functions 1789+ Copyright (C) Andrew Tridgell 1992-1998 1790+ 1791+ This program is free software; you can redistribute it and/or modify 1792+ it under the terms of the GNU General Public License as published by 1793+ the Free Software Foundation; either version 3 of the License, or 1794+ (at your option) any later version. 1795+ 1796+ This program is distributed in the hope that it will be useful, 1797+ but WITHOUT ANY WARRANTY; without even the implied warranty of 1798+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1799+ GNU General Public License for more details. 1800+ 1801+ You should have received a copy of the GNU General Public License 1802+ along with this program. If not, see <http://www.gnu.org/licenses/>. 1803+*/ 1804+ 1805+/* The following definitions come from lib/bitmap.c */ 1806+ 1807+struct bitmap { 1808+ uint32_t *b; 1809+ unsigned int n; 1810+}; 1811+ 1812+struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n); 1813+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src); 1814+bool bitmap_set(struct bitmap *bm, unsigned i); 1815+bool bitmap_clear(struct bitmap *bm, unsigned i); 1816+bool bitmap_query(struct bitmap *bm, unsigned i); 1817+int bitmap_find(struct bitmap *bm, unsigned ofs); 1818--- a/lib/util/wscript_build 1819+++ b/lib/util/wscript_build 1820@@ -99,5 +99,11 @@ bld.SAMBA_LIBRARY('tdb-wrap', 1821 public_headers='tdb_wrap.h', 1822 private_library=True, 1823 local_include=False 1824- ) 1825+ ) 1826+ 1827+bld.SAMBA_LIBRARY('bitmap', 1828+ source='bitmap.c', 1829+ deps='talloc samba-util', 1830+ local_include=False, 1831+ private_library=True) 1832 1833--- a/source3/include/proto.h 1834+++ b/source3/include/proto.h 1835@@ -61,15 +61,6 @@ const char *audit_description_str(uint32 1836 bool get_audit_category_from_param(const char *param, uint32 *audit_category); 1837 const char *audit_policy_str(TALLOC_CTX *mem_ctx, uint32 policy); 1838 1839-/* The following definitions come from lib/bitmap.c */ 1840- 1841-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n); 1842-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src); 1843-bool bitmap_set(struct bitmap *bm, unsigned i); 1844-bool bitmap_clear(struct bitmap *bm, unsigned i); 1845-bool bitmap_query(struct bitmap *bm, unsigned i); 1846-int bitmap_find(struct bitmap *bm, unsigned ofs); 1847- 1848 /* The following definitions come from lib/charcnv.c */ 1849 1850 char lp_failed_convert_char(void); 1851--- a/source3/include/smb.h 1852+++ b/source3/include/smb.h 1853@@ -712,7 +712,6 @@ struct connections_data { 1854 uint32 unused_compatitibility_field; 1855 }; 1856 1857- 1858 /* the following are used by loadparm for option lists */ 1859 typedef enum { 1860 P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,P_LIST, 1861@@ -759,11 +758,6 @@ struct parm_struct { 1862 #define FLAG_META 0x8000 /* A meta directive - not a real parameter */ 1863 #define FLAG_CMDLINE 0x10000 /* option has been overridden */ 1864 1865-struct bitmap { 1866- uint32 *b; 1867- unsigned int n; 1868-}; 1869- 1870 /* offsets into message for common items */ 1871 #define smb_com 8 1872 #define smb_rcls 9 1873--- a/source3/modules/vfs_acl_common.c 1874+++ b/source3/modules/vfs_acl_common.c 1875@@ -23,6 +23,7 @@ 1876 #include "system/filesys.h" 1877 #include "../libcli/security/security.h" 1878 #include "../librpc/gen_ndr/ndr_security.h" 1879+#include "../lib/util/bitmap.h" 1880 1881 static NTSTATUS create_acl_blob(const struct security_descriptor *psd, 1882 DATA_BLOB *pblob, 1883--- a/source3/modules/vfs_full_audit.c 1884+++ b/source3/modules/vfs_full_audit.c 1885@@ -64,6 +64,7 @@ 1886 #include "../librpc/gen_ndr/ndr_netlogon.h" 1887 #include "auth.h" 1888 #include "ntioctl.h" 1889+#include "lib/util/bitmap.h" 1890 1891 static int vfs_full_audit_debug_level = DBGC_VFS; 1892 1893--- a/source3/param/loadparm.c 1894+++ b/source3/param/loadparm.c 1895@@ -64,6 +64,7 @@ 1896 #include "smb_signing.h" 1897 #include "dbwrap.h" 1898 #include "smbldap.h" 1899+#include "../lib/util/bitmap.h" 1900 1901 #ifdef HAVE_SYS_SYSCTL_H 1902 #include <sys/sysctl.h> 1903--- a/source3/passdb/pdb_get_set.c 1904+++ b/source3/passdb/pdb_get_set.c 1905@@ -25,6 +25,7 @@ 1906 #include "passdb.h" 1907 #include "../libcli/auth/libcli_auth.h" 1908 #include "../libcli/security/security.h" 1909+#include "../lib/util/bitmap.h" 1910 1911 #undef DBGC_CLASS 1912 #define DBGC_CLASS DBGC_PASSDB 1913--- a/source3/smbd/conn.c 1914+++ b/source3/smbd/conn.c 1915@@ -23,6 +23,7 @@ 1916 #include "smbd/smbd.h" 1917 #include "smbd/globals.h" 1918 #include "rpc_server/rpc_ncacn_np.h" 1919+#include "lib/util/bitmap.h" 1920 1921 /* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The 1922 * maximum size of the bitmap is the largest positive integer, but you will hit 1923--- a/source3/smbd/dir.c 1924+++ b/source3/smbd/dir.c 1925@@ -23,6 +23,7 @@ 1926 #include "smbd/smbd.h" 1927 #include "smbd/globals.h" 1928 #include "libcli/security/security.h" 1929+#include "lib/util/bitmap.h" 1930 1931 /* 1932 This module implements directory related functions for Samba. 1933--- a/source3/smbd/files.c 1934+++ b/source3/smbd/files.c 1935@@ -22,6 +22,7 @@ 1936 #include "smbd/globals.h" 1937 #include "libcli/security/security.h" 1938 #include "util_tdb.h" 1939+#include "lib/util/bitmap.h" 1940 1941 #define VALID_FNUM(fnum) (((fnum) >= 0) && ((fnum) < real_max_open_files)) 1942 1943--- a/source3/smbd/smb2_server.c 1944+++ b/source3/smbd/smb2_server.c 1945@@ -26,6 +26,7 @@ 1946 #include "../lib/tsocket/tsocket.h" 1947 #include "../lib/util/tevent_ntstatus.h" 1948 #include "smbprofile.h" 1949+#include "../lib/util/bitmap.h" 1950 1951 #define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9) 1952 1953--- a/source3/rpc_client/cli_pipe.c 1954+++ b/source3/rpc_client/cli_pipe.c 1955@@ -28,6 +28,7 @@ 1956 #include "../libcli/auth/ntlmssp.h" 1957 #include "ntlmssp_wrap.h" 1958 #include "librpc/gen_ndr/ndr_dcerpc.h" 1959+#include "librpc/gen_ndr/ndr_netlogon_c.h" 1960 #include "librpc/rpc/dcerpc.h" 1961 #include "librpc/crypto/gse.h" 1962 #include "librpc/crypto/spnego.h" 1963@@ -399,6 +400,7 @@ static NTSTATUS cli_pipe_validate_curren 1964 struct ncacn_packet *pkt, 1965 DATA_BLOB *pdu, 1966 uint8_t expected_pkt_type, 1967+ uint32_t call_id, 1968 DATA_BLOB *rdata, 1969 DATA_BLOB *reply_pdu) 1970 { 1971@@ -497,7 +499,7 @@ static NTSTATUS cli_pipe_validate_curren 1972 "from %s!\n", 1973 (unsigned int)pkt->ptype, 1974 rpccli_pipe_txt(talloc_tos(), cli))); 1975- return NT_STATUS_INVALID_INFO_CLASS; 1976+ return NT_STATUS_RPC_PROTOCOL_ERROR; 1977 } 1978 1979 if (pkt->ptype != expected_pkt_type) { 1980@@ -505,7 +507,15 @@ static NTSTATUS cli_pipe_validate_curren 1981 "RPC packet type - %u, not %u\n", 1982 rpccli_pipe_txt(talloc_tos(), cli), 1983 pkt->ptype, expected_pkt_type)); 1984- return NT_STATUS_INVALID_INFO_CLASS; 1985+ return NT_STATUS_RPC_PROTOCOL_ERROR; 1986+ } 1987+ 1988+ if (pkt->call_id != call_id) { 1989+ DEBUG(3, (__location__ ": Connection to %s got an unexpected " 1990+ "RPC call_id - %u, not %u\n", 1991+ rpccli_pipe_txt(talloc_tos(), cli), 1992+ pkt->call_id, call_id)); 1993+ return NT_STATUS_RPC_PROTOCOL_ERROR; 1994 } 1995 1996 /* Do this just before return - we don't want to modify any rpc header 1997@@ -898,6 +908,7 @@ static void rpc_api_pipe_got_pdu(struct 1998 state->cli, state->pkt, 1999 &state->incoming_frag, 2000 state->expected_pkt_type, 2001+ state->call_id, 2002 &rdata, 2003 &state->reply_pdu); 2004 2005@@ -1269,12 +1280,17 @@ struct rpc_api_pipe_req_state { 2006 uint32_t call_id; 2007 DATA_BLOB *req_data; 2008 uint32_t req_data_sent; 2009+ DATA_BLOB req_trailer; 2010+ uint32_t req_trailer_sent; 2011+ bool verify_bitmask1; 2012+ bool verify_pcontext; 2013 DATA_BLOB rpc_out; 2014 DATA_BLOB reply_pdu; 2015 }; 2016 2017 static void rpc_api_pipe_req_write_done(struct tevent_req *subreq); 2018 static void rpc_api_pipe_req_done(struct tevent_req *subreq); 2019+static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state); 2020 static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state, 2021 bool *is_last_frag); 2022 2023@@ -1310,6 +1326,11 @@ struct tevent_req *rpc_api_pipe_req_send 2024 goto post_status; 2025 } 2026 2027+ status = prepare_verification_trailer(state); 2028+ if (!NT_STATUS_IS_OK(status)) { 2029+ goto post_status; 2030+ } 2031+ 2032 status = prepare_next_frag(state, &is_last_frag); 2033 if (!NT_STATUS_IS_OK(status)) { 2034 goto post_status; 2035@@ -1344,25 +1365,161 @@ struct tevent_req *rpc_api_pipe_req_send 2036 return NULL; 2037 } 2038 2039+static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state) 2040+{ 2041+ struct pipe_auth_data *a = state->cli->auth; 2042+ struct dcerpc_sec_verification_trailer *t; 2043+ struct dcerpc_sec_vt *c = NULL; 2044+ struct ndr_push *ndr = NULL; 2045+ enum ndr_err_code ndr_err; 2046+ size_t align = 0; 2047+ size_t pad = 0; 2048+ 2049+ if (a == NULL) { 2050+ return NT_STATUS_OK; 2051+ } 2052+ 2053+ if (a->auth_level < DCERPC_AUTH_LEVEL_INTEGRITY) { 2054+ return NT_STATUS_OK; 2055+ } 2056+ 2057+ t = talloc_zero(state, struct dcerpc_sec_verification_trailer); 2058+ if (t == NULL) { 2059+ return NT_STATUS_NO_MEMORY; 2060+ } 2061+ 2062+ if (!a->verified_bitmask1) { 2063+ t->commands = talloc_realloc(t, t->commands, 2064+ struct dcerpc_sec_vt, 2065+ t->count.count + 1); 2066+ if (t->commands == NULL) { 2067+ return NT_STATUS_NO_MEMORY; 2068+ } 2069+ c = &t->commands[t->count.count++]; 2070+ ZERO_STRUCTP(c); 2071+ 2072+ c->command = DCERPC_SEC_VT_COMMAND_BITMASK1; 2073+ state->verify_bitmask1 = true; 2074+ } 2075+ 2076+ if (!state->cli->verified_pcontext) { 2077+ t->commands = talloc_realloc(t, t->commands, 2078+ struct dcerpc_sec_vt, 2079+ t->count.count + 1); 2080+ if (t->commands == NULL) { 2081+ return NT_STATUS_NO_MEMORY; 2082+ } 2083+ c = &t->commands[t->count.count++]; 2084+ ZERO_STRUCTP(c); 2085+ 2086+ c->command = DCERPC_SEC_VT_COMMAND_PCONTEXT; 2087+ c->u.pcontext.abstract_syntax = state->cli->abstract_syntax; 2088+ c->u.pcontext.transfer_syntax = state->cli->transfer_syntax; 2089+ 2090+ state->verify_pcontext = true; 2091+ } 2092+ 2093+ if (true) { /* We do not support header signing */ 2094+ t->commands = talloc_realloc(t, t->commands, 2095+ struct dcerpc_sec_vt, 2096+ t->count.count + 1); 2097+ if (t->commands == NULL) { 2098+ return NT_STATUS_NO_MEMORY; 2099+ } 2100+ c = &t->commands[t->count.count++]; 2101+ ZERO_STRUCTP(c); 2102+ 2103+ c->command = DCERPC_SEC_VT_COMMAND_HEADER2; 2104+ c->u.header2.ptype = DCERPC_PKT_REQUEST; 2105+ c->u.header2.drep[0] = DCERPC_DREP_LE; 2106+ c->u.header2.drep[1] = 0; 2107+ c->u.header2.drep[2] = 0; 2108+ c->u.header2.drep[3] = 0; 2109+ c->u.header2.call_id = state->call_id; 2110+ c->u.header2.context_id = 0; 2111+ c->u.header2.opnum = state->op_num; 2112+ } 2113+ 2114+ if (t->count.count == 0) { 2115+ TALLOC_FREE(t); 2116+ return NT_STATUS_OK; 2117+ } 2118+ 2119+ c = &t->commands[t->count.count - 1]; 2120+ c->command |= DCERPC_SEC_VT_COMMAND_END; 2121+ 2122+ if (DEBUGLEVEL >= 10) { 2123+ NDR_PRINT_DEBUG(dcerpc_sec_verification_trailer, t); 2124+ } 2125+ 2126+ ndr = ndr_push_init_ctx(state); 2127+ if (ndr == NULL) { 2128+ return NT_STATUS_NO_MEMORY; 2129+ } 2130+ 2131+ ndr_err = ndr_push_dcerpc_sec_verification_trailer(ndr, 2132+ NDR_SCALARS | NDR_BUFFERS, 2133+ t); 2134+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 2135+ return ndr_map_error2ntstatus(ndr_err); 2136+ } 2137+ state->req_trailer = ndr_push_blob(ndr); 2138+ 2139+ align = state->req_data->length & 0x3; 2140+ if (align > 0) { 2141+ pad = 4 - align; 2142+ } 2143+ if (pad > 0) { 2144+ bool ok; 2145+ uint8_t *p; 2146+ const uint8_t zeros[4] = { 0, }; 2147+ 2148+ ok = data_blob_append(ndr, &state->req_trailer, zeros, pad); 2149+ if (!ok) { 2150+ return NT_STATUS_NO_MEMORY; 2151+ } 2152+ 2153+ /* move the padding to the start */ 2154+ p = state->req_trailer.data; 2155+ memmove(p + pad, p, state->req_trailer.length - pad); 2156+ memset(p, 0, pad); 2157+ } 2158+ 2159+ return NT_STATUS_OK; 2160+} 2161+ 2162 static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state, 2163 bool *is_last_frag) 2164 { 2165- size_t data_sent_thistime; 2166 size_t auth_len; 2167 size_t frag_len; 2168 uint8_t flags = 0; 2169 size_t pad_len; 2170 size_t data_left; 2171+ size_t data_thistime; 2172+ size_t trailer_left; 2173+ size_t trailer_thistime = 0; 2174+ size_t total_left; 2175+ size_t total_thistime; 2176 NTSTATUS status; 2177+ bool ok; 2178 union dcerpc_payload u; 2179 2180 data_left = state->req_data->length - state->req_data_sent; 2181+ trailer_left = state->req_trailer.length - state->req_trailer_sent; 2182+ total_left = data_left + trailer_left; 2183+ if ((total_left < data_left) || (total_left < trailer_left)) { 2184+ /* 2185+ * overflow 2186+ */ 2187+ return NT_STATUS_INVALID_PARAMETER_MIX; 2188+ } 2189 2190 status = dcerpc_guess_sizes(state->cli->auth, 2191- DCERPC_REQUEST_LENGTH, data_left, 2192+ DCERPC_REQUEST_LENGTH, total_left, 2193 state->cli->max_xmit_frag, 2194 CLIENT_NDR_PADDING_SIZE, 2195- &data_sent_thistime, 2196+ &total_thistime, 2197 &frag_len, &auth_len, &pad_len); 2198 if (!NT_STATUS_IS_OK(status)) { 2199 return status; 2200@@ -1372,15 +1529,20 @@ static NTSTATUS prepare_next_frag(struct 2201 flags = DCERPC_PFC_FLAG_FIRST; 2202 } 2203 2204- if (data_sent_thistime == data_left) { 2205+ if (total_thistime == total_left) { 2206 flags |= DCERPC_PFC_FLAG_LAST; 2207 } 2208 2209+ data_thistime = MIN(total_thistime, data_left); 2210+ if (data_thistime < total_thistime) { 2211+ trailer_thistime = total_thistime - data_thistime; 2212+ } 2213+ 2214 data_blob_free(&state->rpc_out); 2215 2216 ZERO_STRUCT(u.request); 2217 2218- u.request.alloc_hint = state->req_data->length; 2219+ u.request.alloc_hint = total_left; 2220 u.request.context_id = 0; 2221 u.request.opnum = state->op_num; 2222 2223@@ -1400,11 +1562,26 @@ static NTSTATUS prepare_next_frag(struct 2224 * at this stage */ 2225 dcerpc_set_frag_length(&state->rpc_out, frag_len); 2226 2227- /* Copy in the data. */ 2228- if (!data_blob_append(NULL, &state->rpc_out, 2229+ if (data_thistime > 0) { 2230+ /* Copy in the data. */ 2231+ ok = data_blob_append(NULL, &state->rpc_out, 2232 state->req_data->data + state->req_data_sent, 2233- data_sent_thistime)) { 2234- return NT_STATUS_NO_MEMORY; 2235+ data_thistime); 2236+ if (!ok) { 2237+ return NT_STATUS_NO_MEMORY; 2238+ } 2239+ state->req_data_sent += data_thistime; 2240+ } 2241+ 2242+ if (trailer_thistime > 0) { 2243+ /* Copy in the verification trailer. */ 2244+ ok = data_blob_append(NULL, &state->rpc_out, 2245+ state->req_trailer.data + state->req_trailer_sent, 2246+ trailer_thistime); 2247+ if (!ok) { 2248+ return NT_STATUS_NO_MEMORY; 2249+ } 2250+ state->req_trailer_sent += trailer_thistime; 2251 } 2252 2253 switch (state->cli->auth->auth_level) { 2254@@ -1424,7 +1601,6 @@ static NTSTATUS prepare_next_frag(struct 2255 return NT_STATUS_INVALID_PARAMETER; 2256 } 2257 2258- state->req_data_sent += data_sent_thistime; 2259 *is_last_frag = ((flags & DCERPC_PFC_FLAG_LAST) != 0); 2260 2261 return status; 2262@@ -1488,6 +1664,20 @@ static void rpc_api_pipe_req_done(struct 2263 tevent_req_nterror(req, status); 2264 return; 2265 } 2266+ 2267+ if (state->cli->auth == NULL) { 2268+ tevent_req_done(req); 2269+ return; 2270+ } 2271+ 2272+ if (state->verify_bitmask1) { 2273+ state->cli->auth->verified_bitmask1 = true; 2274+ } 2275+ 2276+ if (state->verify_pcontext) { 2277+ state->cli->verified_pcontext = true; 2278+ } 2279+ 2280 tevent_req_done(req); 2281 } 2282 2283@@ -1647,9 +1837,15 @@ struct rpc_pipe_bind_state { 2284 DATA_BLOB rpc_out; 2285 bool auth3; 2286 uint32_t rpc_call_id; 2287+ struct netr_Authenticator auth; 2288+ struct netr_Authenticator return_auth; 2289+ struct netlogon_creds_CredentialState *creds; 2290+ union netr_Capabilities capabilities; 2291+ struct netr_LogonGetCapabilities r; 2292 }; 2293 2294 static void rpc_pipe_bind_step_one_done(struct tevent_req *subreq); 2295+static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req); 2296 static NTSTATUS rpc_bind_next_send(struct tevent_req *req, 2297 struct rpc_pipe_bind_state *state, 2298 DATA_BLOB *credentials); 2299@@ -1753,11 +1949,14 @@ static void rpc_pipe_bind_step_one_done( 2300 2301 case DCERPC_AUTH_TYPE_NONE: 2302 case DCERPC_AUTH_TYPE_NCALRPC_AS_SYSTEM: 2303- case DCERPC_AUTH_TYPE_SCHANNEL: 2304 /* Bind complete. */ 2305 tevent_req_done(req); 2306 return; 2307 2308+ case DCERPC_AUTH_TYPE_SCHANNEL: 2309+ rpc_pipe_bind_step_two_trigger(req); 2310+ return; 2311+ 2312 case DCERPC_AUTH_TYPE_NTLMSSP: 2313 case DCERPC_AUTH_TYPE_SPNEGO: 2314 case DCERPC_AUTH_TYPE_KRB5: 2315@@ -1869,6 +2068,153 @@ err_out: 2316 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR); 2317 } 2318 2319+static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq); 2320+ 2321+static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req) 2322+{ 2323+ struct rpc_pipe_bind_state *state = 2324+ tevent_req_data(req, 2325+ struct rpc_pipe_bind_state); 2326+ struct dcerpc_binding_handle *b = state->cli->binding_handle; 2327+ struct schannel_state *schannel_auth = 2328+ talloc_get_type_abort(state->cli->auth->auth_ctx, 2329+ struct schannel_state); 2330+ struct tevent_req *subreq; 2331+ 2332+ if (schannel_auth == NULL || 2333+ !ndr_syntax_id_equal(&state->cli->abstract_syntax, 2334+ &ndr_table_netlogon.syntax_id)) { 2335+ tevent_req_done(req); 2336+ return; 2337+ } 2338+ 2339+ ZERO_STRUCT(state->return_auth); 2340+ 2341+ state->creds = netlogon_creds_copy(state, schannel_auth->creds); 2342+ if (state->creds == NULL) { 2343+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY); 2344+ return; 2345+ } 2346+ 2347+ netlogon_creds_client_authenticator(state->creds, &state->auth); 2348+ 2349+ state->r.in.server_name = state->cli->srv_name_slash; 2350+ state->r.in.computer_name = state->creds->computer_name; 2351+ state->r.in.credential = &state->auth; 2352+ state->r.in.query_level = 1; 2353+ state->r.in.return_authenticator = &state->return_auth; 2354+ 2355+ state->r.out.capabilities = &state->capabilities; 2356+ state->r.out.return_authenticator = &state->return_auth; 2357+ 2358+ subreq = dcerpc_netr_LogonGetCapabilities_r_send(talloc_tos(), 2359+ state->ev, 2360+ b, 2361+ &state->r); 2362+ if (subreq == NULL) { 2363+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY); 2364+ return; 2365+ } 2366+ 2367+ tevent_req_set_callback(subreq, rpc_pipe_bind_step_two_done, req); 2368+ return; 2369+} 2370+ 2371+static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq) 2372+{ 2373+ struct tevent_req *req = 2374+ tevent_req_callback_data(subreq, 2375+ struct tevent_req); 2376+ struct rpc_pipe_bind_state *state = 2377+ tevent_req_data(req, 2378+ struct rpc_pipe_bind_state); 2379+ struct schannel_state *schannel_auth = 2380+ talloc_get_type_abort(state->cli->auth->auth_ctx, 2381+ struct schannel_state); 2382+ NTSTATUS status; 2383+ 2384+ status = dcerpc_netr_LogonGetCapabilities_r_recv(subreq, talloc_tos()); 2385+ TALLOC_FREE(subreq); 2386+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) { 2387+ if (state->cli->dc->negotiate_flags & 2388+ NETLOGON_NEG_SUPPORTS_AES) { 2389+ DEBUG(5, ("AES is not supported and the error was %s\n", 2390+ nt_errstr(status))); 2391+ tevent_req_nterror(req, 2392+ NT_STATUS_INVALID_NETWORK_RESPONSE); 2393+ return; 2394+ } 2395+ 2396+ /* This is probably NT */ 2397+ DEBUG(5, ("We are checking against an NT - %s\n", 2398+ nt_errstr(status))); 2399+ tevent_req_done(req); 2400+ return; 2401+ } else if (!NT_STATUS_IS_OK(status)) { 2402+ DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n", 2403+ nt_errstr(status))); 2404+ tevent_req_nterror(req, status); 2405+ return; 2406+ } 2407+ 2408+ if (NT_STATUS_EQUAL(state->r.out.result, NT_STATUS_NOT_IMPLEMENTED)) { 2409+ if (state->creds->negotiate_flags & NETLOGON_NEG_SUPPORTS_AES) { 2410+ /* This means AES isn't supported. */ 2411+ DEBUG(5, ("AES is not supported and the error was %s\n", 2412+ nt_errstr(state->r.out.result))); 2413+ tevent_req_nterror(req, 2414+ NT_STATUS_INVALID_NETWORK_RESPONSE); 2415+ return; 2416+ } 2417+ 2418+ /* This is probably an old Samba version */ 2419+ DEBUG(5, ("We are checking against an old Samba version - %s\n", 2420+ nt_errstr(state->r.out.result))); 2421+ tevent_req_done(req); 2422+ return; 2423+ } 2424+ 2425+ /* We need to check the credential state here, cause win2k3 and earlier 2426+ * returns NT_STATUS_NOT_IMPLEMENTED */ 2427+ if (!netlogon_creds_client_check(state->creds, 2428+ &state->r.out.return_authenticator->cred)) { 2429+ /* 2430+ * Server replied with bad credential. Fail. 2431+ */ 2432+ DEBUG(0,("rpc_pipe_bind_step_two_done: server %s " 2433+ "replied with bad credential\n", 2434+ state->cli->desthost)); 2435+ tevent_req_nterror(req, NT_STATUS_UNSUCCESSFUL); 2436+ return; 2437+ } 2438+ 2439+ TALLOC_FREE(schannel_auth->creds); 2440+ schannel_auth->creds = talloc_steal(state->cli, state->creds); 2441+ 2442+ if (!NT_STATUS_IS_OK(state->r.out.result)) { 2443+ DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n", 2444+ nt_errstr(state->r.out.result))); 2445+ tevent_req_nterror(req, state->r.out.result); 2446+ return; 2447+ } 2448+ 2449+ if (state->creds->negotiate_flags != 2450+ state->r.out.capabilities->server_capabilities) { 2451+ DEBUG(0, ("The client capabilities don't match the server " 2452+ "capabilities: local[0x%08X] remote[0x%08X]\n", 2453+ state->creds->negotiate_flags, 2454+ state->capabilities.server_capabilities)); 2455+ tevent_req_nterror(req, 2456+ NT_STATUS_INVALID_NETWORK_RESPONSE); 2457+ return; 2458+ } 2459+ 2460+ /* TODO: Add downgrade dectection. */ 2461+ 2462+ tevent_req_done(req); 2463+ return; 2464+} 2465+ 2466 static NTSTATUS rpc_bind_next_send(struct tevent_req *req, 2467 struct rpc_pipe_bind_state *state, 2468 DATA_BLOB *auth_token) 2469--- a/source3/librpc/rpc/dcerpc.h 2470+++ b/source3/librpc/rpc/dcerpc.h 2471@@ -39,6 +39,7 @@ struct NL_AUTH_MESSAGE; 2472 struct pipe_auth_data { 2473 enum dcerpc_AuthType auth_type; 2474 enum dcerpc_AuthLevel auth_level; 2475+ bool verified_bitmask1; 2476 2477 void *auth_ctx; 2478 2479--- a/source3/rpc_client/rpc_client.h 2480+++ b/source3/rpc_client/rpc_client.h 2481@@ -39,6 +39,7 @@ struct rpc_pipe_client { 2482 2483 struct ndr_syntax_id abstract_syntax; 2484 struct ndr_syntax_id transfer_syntax; 2485+ bool verified_pcontext; 2486 2487 char *desthost; 2488 char *srv_name_slash; 2489--- /dev/null 2490+++ b/librpc/ndr/ndr_dcerpc.h 2491@@ -0,0 +1,25 @@ 2492+/* 2493+ Unix SMB/CIFS implementation. 2494+ 2495+ Manually parsed structures found in the DCERPC protocol 2496+ 2497+ Copyright (C) Stefan Metzmacher 2014 2498+ Copyright (C) Gregor Beck 2014 2499+ 2500+ This program is free software; you can redistribute it and/or modify 2501+ it under the terms of the GNU General Public License as published by 2502+ the Free Software Foundation; either version 3 of the License, or 2503+ (at your option) any later version. 2504+ 2505+ This program is distributed in the hope that it will be useful, 2506+ but WITHOUT ANY WARRANTY; without even the implied warranty of 2507+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2508+ GNU General Public License for more details. 2509+ 2510+ You should have received a copy of the GNU General Public License 2511+ along with this program. If not, see <http://www.gnu.org/licenses/>. 2512+*/ 2513+ 2514+enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer( 2515+ struct ndr_pull *ndr, TALLOC_CTX *mem_ctx, 2516+ struct dcerpc_sec_verification_trailer **_r); 2517--- /dev/null 2518+++ b/librpc/ABI/ndr-0.0.3.sigs 2519@@ -0,0 +1,251 @@ 2520+GUID_all_zero: bool (const struct GUID *) 2521+GUID_compare: int (const struct GUID *, const struct GUID *) 2522+GUID_equal: bool (const struct GUID *, const struct GUID *) 2523+GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) 2524+GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) 2525+GUID_from_string: NTSTATUS (const char *, struct GUID *) 2526+GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *) 2527+GUID_random: struct GUID (void) 2528+GUID_string: char *(TALLOC_CTX *, const struct GUID *) 2529+GUID_string2: char *(TALLOC_CTX *, const struct GUID *) 2530+GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *) 2531+GUID_zero: struct GUID (void) 2532+ndr_align_size: size_t (uint32_t, size_t) 2533+ndr_charset_length: uint32_t (const void *, charset_t) 2534+ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) 2535+ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) 2536+ndr_check_padding: void (struct ndr_pull *, size_t) 2537+ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t) 2538+ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t) 2539+ndr_get_array_length: uint32_t (struct ndr_pull *, const void *) 2540+ndr_get_array_size: uint32_t (struct ndr_pull *, const void *) 2541+ndr_map_error2errno: int (enum ndr_err_code) 2542+ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code) 2543+ndr_map_error2string: const char *(enum ndr_err_code) 2544+ndr_policy_handle_empty: bool (const struct policy_handle *) 2545+ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *) 2546+ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB) 2547+ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *) 2548+ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *) 2549+ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS) 2550+ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME) 2551+ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME) 2552+ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME) 2553+ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR) 2554+ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t) 2555+ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t) 2556+ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t) 2557+ndr_print_bool: void (struct ndr_print *, const char *, const bool) 2558+ndr_print_debug: void (ndr_print_fn_t, const char *, void *) 2559+ndr_print_debug_helper: void (struct ndr_print *, const char *, ...) 2560+ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *) 2561+ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...) 2562+ndr_print_dlong: void (struct ndr_print *, const char *, int64_t) 2563+ndr_print_double: void (struct ndr_print *, const char *, double) 2564+ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t) 2565+ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *) 2566+ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *) 2567+ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *) 2568+ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t) 2569+ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t) 2570+ndr_print_int16: void (struct ndr_print *, const char *, int16_t) 2571+ndr_print_int32: void (struct ndr_print *, const char *, int32_t) 2572+ndr_print_int3264: void (struct ndr_print *, const char *, int32_t) 2573+ndr_print_int8: void (struct ndr_print *, const char *, int8_t) 2574+ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *) 2575+ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *) 2576+ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *) 2577+ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID) 2578+ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType) 2579+ndr_print_null: void (struct ndr_print *) 2580+ndr_print_pointer: void (struct ndr_print *, const char *, void *) 2581+ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *) 2582+ndr_print_printf_helper: void (struct ndr_print *, const char *, ...) 2583+ndr_print_ptr: void (struct ndr_print *, const char *, const void *) 2584+ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t) 2585+ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *) 2586+ndr_print_string: void (struct ndr_print *, const char *, const char *) 2587+ndr_print_string_array: void (struct ndr_print *, const char *, const char **) 2588+ndr_print_string_helper: void (struct ndr_print *, const char *, ...) 2589+ndr_print_struct: void (struct ndr_print *, const char *, const char *) 2590+ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *) 2591+ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t) 2592+ndr_print_time_t: void (struct ndr_print *, const char *, time_t) 2593+ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *) 2594+ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *) 2595+ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t) 2596+ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t) 2597+ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t) 2598+ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t) 2599+ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t) 2600+ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t) 2601+ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t) 2602+ndr_print_union: void (struct ndr_print *, const char *, int, const char *) 2603+ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *) 2604+ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *) 2605+ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *) 2606+ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type) 2607+ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *) 2608+ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *) 2609+ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *) 2610+ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *) 2611+ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 2612+ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 2613+ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) 2614+ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *) 2615+ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t) 2616+ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t) 2617+ndr_pull_append: enum ndr_err_code (struct ndr_pull *, DATA_BLOB *) 2618+ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *) 2619+ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *) 2620+ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t) 2621+ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t) 2622+ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) 2623+ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) 2624+ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *) 2625+ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *) 2626+ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 2627+ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 2628+ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 2629+ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) 2630+ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...) 2631+ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) 2632+ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *) 2633+ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *) 2634+ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *) 2635+ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 2636+ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *) 2637+ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *) 2638+ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *) 2639+ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *) 2640+ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **) 2641+ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **) 2642+ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *) 2643+ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *) 2644+ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *) 2645+ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **) 2646+ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *) 2647+ndr_pull_pop: enum ndr_err_code (struct ndr_pull *) 2648+ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) 2649+ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 2650+ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *) 2651+ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *) 2652+ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t) 2653+ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 2654+ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) 2655+ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *) 2656+ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **) 2657+ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***) 2658+ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) 2659+ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) 2660+ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t) 2661+ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t) 2662+ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 2663+ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *) 2664+ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *) 2665+ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *) 2666+ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t) 2667+ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 2668+ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) 2669+ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *) 2670+ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 2671+ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) 2672+ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 2673+ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) 2674+ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) 2675+ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t) 2676+ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) 2677+ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) 2678+ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *) 2679+ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *) 2680+ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB) 2681+ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *) 2682+ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *) 2683+ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS) 2684+ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME) 2685+ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME) 2686+ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME) 2687+ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR) 2688+ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t) 2689+ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t) 2690+ndr_push_blob: DATA_BLOB (struct ndr_push *) 2691+ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t) 2692+ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t) 2693+ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t) 2694+ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double) 2695+ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) 2696+ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) 2697+ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) 2698+ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) 2699+ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...) 2700+ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t) 2701+ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *) 2702+ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *) 2703+ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *) 2704+ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t) 2705+ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t) 2706+ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *) 2707+ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t) 2708+ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t) 2709+ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t) 2710+ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *) 2711+ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *) 2712+ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *) 2713+ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID) 2714+ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType) 2715+ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t) 2716+ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *) 2717+ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *) 2718+ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *) 2719+ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) 2720+ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *) 2721+ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *) 2722+ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t) 2723+ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) 2724+ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) 2725+ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *) 2726+ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) 2727+ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *) 2728+ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *) 2729+ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **) 2730+ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t) 2731+ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t) 2732+ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t) 2733+ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t) 2734+ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t) 2735+ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *) 2736+ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *) 2737+ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t) 2738+ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t) 2739+ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t) 2740+ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t) 2741+ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) 2742+ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) 2743+ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) 2744+ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t) 2745+ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) 2746+ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t) 2747+ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t) 2748+ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *) 2749+ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *) 2750+ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type) 2751+ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t) 2752+ndr_set_flags: void (uint32_t *, uint32_t) 2753+ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int) 2754+ndr_size_GUID: size_t (const struct GUID *, int) 2755+ndr_size_string: uint32_t (int, const char * const *, int) 2756+ndr_size_string_array: size_t (const char **, uint32_t, int) 2757+ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t) 2758+ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t) 2759+ndr_string_array_size: size_t (struct ndr_push *, const char *) 2760+ndr_string_length: uint32_t (const void *, uint32_t) 2761+ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *) 2762+ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *) 2763+ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0 2764+ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *) 2765+ndr_token_peek: uint32_t (struct ndr_token_list **, const void *) 2766+ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *) 2767+ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool) 2768+ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t) 2769+ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2 2770+ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\314\066"}, if_version = 1 2771--- a/librpc/ndr/ndr_misc.c 2772+++ b/librpc/ndr/ndr_misc.c 2773@@ -35,3 +35,50 @@ bool ndr_syntax_id_equal(const struct nd 2774 return GUID_equal(&i1->uuid, &i2->uuid) 2775 && (i1->if_version == i2->if_version); 2776 } 2777+ 2778+_PUBLIC_ char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id) 2779+{ 2780+ return talloc_asprintf(mem_ctx, 2781+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x", 2782+ id->uuid.time_low, id->uuid.time_mid, 2783+ id->uuid.time_hi_and_version, 2784+ id->uuid.clock_seq[0], 2785+ id->uuid.clock_seq[1], 2786+ id->uuid.node[0], id->uuid.node[1], 2787+ id->uuid.node[2], id->uuid.node[3], 2788+ id->uuid.node[4], id->uuid.node[5], 2789+ (unsigned)id->if_version); 2790+} 2791+ 2792+_PUBLIC_ bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id) 2793+{ 2794+ int ret; 2795+ size_t i; 2796+ uint32_t time_low; 2797+ uint32_t time_mid, time_hi_and_version; 2798+ uint32_t clock_seq[2]; 2799+ uint32_t node[6]; 2800+ uint32_t if_version; 2801+ 2802+ ret = sscanf(s, 2803+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x", 2804+ &time_low, &time_mid, &time_hi_and_version, 2805+ &clock_seq[0], &clock_seq[1], 2806+ &node[0], &node[1], &node[2], &node[3], &node[4], &node[5], 2807+ &if_version); 2808+ if (ret != 12) { 2809+ return false; 2810+ } 2811+ 2812+ id->uuid.time_low = time_low; 2813+ id->uuid.time_mid = time_mid; 2814+ id->uuid.time_hi_and_version = time_hi_and_version; 2815+ id->uuid.clock_seq[0] = clock_seq[0]; 2816+ id->uuid.clock_seq[1] = clock_seq[1]; 2817+ for (i=0; i<6; i++) { 2818+ id->uuid.node[i] = node[i]; 2819+ } 2820+ id->if_version = if_version; 2821+ 2822+ return true; 2823+} 2824--- a/librpc/rpc/dcerpc_util.c 2825+++ b/librpc/rpc/dcerpc_util.c 2826@@ -27,6 +27,7 @@ 2827 #include "librpc/rpc/dcerpc.h" 2828 #include "librpc/gen_ndr/ndr_dcerpc.h" 2829 #include "rpc_common.h" 2830+#include "lib/util/bitmap.h" 2831 2832 /* we need to be able to get/set the fragment length without doing a full 2833 decode */ 2834@@ -341,3 +342,194 @@ NTSTATUS dcerpc_read_ncacn_packet_recv(s 2835 tevent_req_received(req); 2836 return NT_STATUS_OK; 2837 } 2838+ 2839+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt) 2840+{ 2841+ struct dcerpc_sec_vt_header2 ret; 2842+ 2843+ ZERO_STRUCT(ret); 2844+ ret.ptype = pkt->ptype; 2845+ memcpy(&ret.drep, pkt->drep, sizeof(ret.drep)); 2846+ ret.call_id = pkt->call_id; 2847+ 2848+ switch (pkt->ptype) { 2849+ case DCERPC_PKT_REQUEST: 2850+ ret.context_id = pkt->u.request.context_id; 2851+ ret.opnum = pkt->u.request.opnum; 2852+ break; 2853+ 2854+ case DCERPC_PKT_RESPONSE: 2855+ ret.context_id = pkt->u.response.context_id; 2856+ break; 2857+ 2858+ case DCERPC_PKT_FAULT: 2859+ ret.context_id = pkt->u.fault.context_id; 2860+ break; 2861+ 2862+ default: 2863+ break; 2864+ } 2865+ 2866+ return ret; 2867+} 2868+ 2869+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1, 2870+ const struct dcerpc_sec_vt_header2 *v2) 2871+{ 2872+ if (v1->ptype != v2->ptype) { 2873+ return false; 2874+ } 2875+ 2876+ if (memcmp(v1->drep, v2->drep, sizeof(v1->drep)) != 0) { 2877+ return false; 2878+ } 2879+ 2880+ if (v1->call_id != v2->call_id) { 2881+ return false; 2882+ } 2883+ 2884+ if (v1->context_id != v2->context_id) { 2885+ return false; 2886+ } 2887+ 2888+ if (v1->opnum != v2->opnum) { 2889+ return false; 2890+ } 2891+ 2892+ return true; 2893+} 2894+ 2895+static bool dcerpc_sec_vt_is_valid(const struct dcerpc_sec_verification_trailer *r) 2896+{ 2897+ bool ret = false; 2898+ TALLOC_CTX *frame = talloc_stackframe(); 2899+ struct bitmap *commands_seen; 2900+ int i; 2901+ 2902+ if (r->count.count == 0) { 2903+ ret = true; 2904+ goto done; 2905+ } 2906+ 2907+ if (memcmp(r->magic, DCERPC_SEC_VT_MAGIC, sizeof(r->magic)) != 0) { 2908+ goto done; 2909+ } 2910+ 2911+ commands_seen = bitmap_talloc(frame, DCERPC_SEC_VT_COMMAND_ENUM + 1); 2912+ if (commands_seen == NULL) { 2913+ goto done; 2914+ } 2915+ 2916+ for (i=0; i < r->count.count; i++) { 2917+ enum dcerpc_sec_vt_command_enum cmd = 2918+ r->commands[i].command & DCERPC_SEC_VT_COMMAND_ENUM; 2919+ 2920+ if (bitmap_query(commands_seen, cmd)) { 2921+ /* Each command must appear at most once. */ 2922+ goto done; 2923+ } 2924+ bitmap_set(commands_seen, cmd); 2925+ 2926+ switch (cmd) { 2927+ case DCERPC_SEC_VT_COMMAND_BITMASK1: 2928+ case DCERPC_SEC_VT_COMMAND_PCONTEXT: 2929+ case DCERPC_SEC_VT_COMMAND_HEADER2: 2930+ break; 2931+ default: 2932+ if ((r->commands[i].u._unknown.length % 4) != 0) { 2933+ goto done; 2934+ } 2935+ break; 2936+ } 2937+ } 2938+ ret = true; 2939+done: 2940+ TALLOC_FREE(frame); 2941+ return ret; 2942+} 2943+ 2944+#define CHECK(msg, ok) \ 2945+do { \ 2946+ if (!ok) { \ 2947+ DEBUG(10, ("SEC_VT check %s failed\n", msg)); \ 2948+ return false; \ 2949+ } \ 2950+} while(0) 2951+ 2952+#define CHECK_SYNTAX(msg, s1, s2) \ 2953+do { \ 2954+ if (!ndr_syntax_id_equal(&s1, &s2)) { \ 2955+ TALLOC_CTX *frame = talloc_stackframe(); \ 2956+ DEBUG(10, ("SEC_VT check %s failed: %s vs. %s\n", msg, \ 2957+ ndr_syntax_id_to_string(frame, &s1), \ 2958+ ndr_syntax_id_to_string(frame, &s1))); \ 2959+ TALLOC_FREE(frame); \ 2960+ return false; \ 2961+ } \ 2962+} while(0) 2963+ 2964+ 2965+bool dcerpc_sec_verification_trailer_check( 2966+ const struct dcerpc_sec_verification_trailer *vt, 2967+ const uint32_t *bitmask1, 2968+ const struct dcerpc_sec_vt_pcontext *pcontext, 2969+ const struct dcerpc_sec_vt_header2 *header2) 2970+{ 2971+ size_t i; 2972+ 2973+ if (!dcerpc_sec_vt_is_valid(vt)) { 2974+ return false; 2975+ } 2976+ 2977+ for (i=0; i < vt->count.count; i++) { 2978+ struct dcerpc_sec_vt *c = &vt->commands[i]; 2979+ 2980+ switch (c->command & DCERPC_SEC_VT_COMMAND_ENUM) { 2981+ case DCERPC_SEC_VT_COMMAND_BITMASK1: 2982+ if (bitmask1 == NULL) { 2983+ CHECK("Bitmask1 must_process_command", 2984+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); 2985+ break; 2986+ } 2987+ 2988+ if (c->u.bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING) { 2989+ CHECK("Bitmask1 client_header_signing", 2990+ *bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING); 2991+ } 2992+ break; 2993+ 2994+ case DCERPC_SEC_VT_COMMAND_PCONTEXT: 2995+ if (pcontext == NULL) { 2996+ CHECK("Pcontext must_process_command", 2997+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); 2998+ break; 2999+ } 3000+ 3001+ CHECK_SYNTAX("Pcontect abstract_syntax", 3002+ pcontext->abstract_syntax, 3003+ c->u.pcontext.abstract_syntax); 3004+ CHECK_SYNTAX("Pcontext transfer_syntax", 3005+ pcontext->transfer_syntax, 3006+ c->u.pcontext.transfer_syntax); 3007+ break; 3008+ 3009+ case DCERPC_SEC_VT_COMMAND_HEADER2: { 3010+ if (header2 == NULL) { 3011+ CHECK("Header2 must_process_command", 3012+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); 3013+ break; 3014+ } 3015+ 3016+ CHECK("Header2", dcerpc_sec_vt_header2_equal(header2, &c->u.header2)); 3017+ break; 3018+ } 3019+ 3020+ default: 3021+ CHECK("Unknown must_process_command", 3022+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS)); 3023+ break; 3024+ } 3025+ } 3026+ 3027+ return true; 3028+} 3029--- a/librpc/rpc/rpc_common.h 3030+++ b/librpc/rpc/rpc_common.h 3031@@ -296,4 +296,45 @@ NTSTATUS dcerpc_binding_handle_call(stru 3032 TALLOC_CTX *r_mem, 3033 void *r_ptr); 3034 3035+/** 3036+ * Extract header information from a ncacn_packet 3037+ * as a dcerpc_sec_vt_header2 as used by the security verification trailer. 3038+ * 3039+ * @param[in] pkt a packet 3040+ * 3041+ * @return a dcerpc_sec_vt_header2 3042+ */ 3043+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt); 3044+ 3045+ 3046+/** 3047+ * Test if two dcerpc_sec_vt_header2 structures are equal 3048+ * without consideration of reserved fields. 3049+ * 3050+ * @param v1 a pointer to a dcerpc_sec_vt_header2 structure 3051+ * @param v2 a pointer to a dcerpc_sec_vt_header2 structure 3052+ * 3053+ * @retval true if *v1 equals *v2 3054+ */ 3055+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1, 3056+ const struct dcerpc_sec_vt_header2 *v2); 3057+ 3058+/** 3059+ * Check for consistency of the security verification trailer with the PDU header. 3060+ * See <a href="http://msdn.microsoft.com/en-us/library/cc243559.aspx">MS-RPCE 2.2.2.13</a>. 3061+ * A check with an empty trailer succeeds. 3062+ * 3063+ * @param[in] vt a pointer to the security verification trailer. 3064+ * @param[in] bitmask1 which flags were negotiated on the connection. 3065+ * @param[in] pcontext the syntaxes negotiatied for the presentation context. 3066+ * @param[in] header2 some fields from the PDU header. 3067+ * 3068+ * @retval true on success. 3069+ */ 3070+bool dcerpc_sec_verification_trailer_check( 3071+ const struct dcerpc_sec_verification_trailer *vt, 3072+ const uint32_t *bitmask1, 3073+ const struct dcerpc_sec_vt_pcontext *pcontext, 3074+ const struct dcerpc_sec_vt_header2 *header2); 3075+ 3076 #endif /* __DEFAULT_LIBRPC_RPCCOMMON_H__ */ 3077--- a/source4/torture/ndr/ndr.c 3078+++ b/source4/torture/ndr/ndr.c 3079@@ -29,40 +29,65 @@ struct ndr_pull_test_data { 3080 DATA_BLOB data_context; 3081 size_t struct_size; 3082 ndr_pull_flags_fn_t pull_fn; 3083+ ndr_push_flags_fn_t push_fn; 3084 int ndr_flags; 3085+ int flags; 3086 }; 3087 3088-static bool wrap_ndr_pull_test(struct torture_context *tctx, 3089- struct torture_tcase *tcase, 3090- struct torture_test *test) 3091+static bool wrap_ndr_pullpush_test(struct torture_context *tctx, 3092+ struct torture_tcase *tcase, 3093+ struct torture_test *test) 3094 { 3095 bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn; 3096 const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data; 3097- void *ds = talloc_zero_size(tctx, data->struct_size); 3098 struct ndr_pull *ndr = ndr_pull_init_blob(&(data->data), tctx); 3099+ void *ds = talloc_zero_size(ndr, data->struct_size); 3100+ bool ret; 3101+ uint32_t highest_ofs; 3102+ 3103+ ndr->flags |= data->flags; 3104 3105 ndr->flags |= LIBNDR_FLAG_REF_ALLOC; 3106 3107 torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds), 3108 "pulling"); 3109 3110- torture_assert(tctx, ndr->offset == ndr->data_size, 3111+ if (ndr->offset > ndr->relative_highest_offset) { 3112+ highest_ofs = ndr->offset; 3113+ } else { 3114+ highest_ofs = ndr->relative_highest_offset; 3115+ } 3116+ 3117+ torture_assert(tctx, highest_ofs == ndr->data_size, 3118 talloc_asprintf(tctx, 3119- "%d unread bytes", ndr->data_size - ndr->offset)); 3120+ "%d unread bytes", ndr->data_size - highest_ofs)); 3121 3122- if (check_fn != NULL) 3123- return check_fn(tctx, ds); 3124- else 3125- return true; 3126+ if (check_fn != NULL) { 3127+ ret = check_fn(tctx, ds); 3128+ } else { 3129+ ret = true; 3130+ } 3131+ 3132+ if (data->push_fn != NULL) { 3133+ DATA_BLOB outblob; 3134+ torture_assert_ndr_success(tctx, ndr_push_struct_blob(&outblob, ndr, ds, data->push_fn), "pushing"); 3135+ torture_assert_data_blob_equal(tctx, outblob, data->data, "ndr push compare"); 3136+ } 3137+ 3138+ talloc_free(ndr); 3139+ return ret; 3140 } 3141 3142-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( 3143- struct torture_suite *suite, 3144- const char *name, ndr_pull_flags_fn_t pull_fn, 3145- DATA_BLOB db, 3146- size_t struct_size, 3147- int ndr_flags, 3148- bool (*check_fn) (struct torture_context *ctx, void *data)) 3149+_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( 3150+ struct torture_suite *suite, 3151+ const char *name, 3152+ ndr_pull_flags_fn_t pull_fn, 3153+ ndr_push_flags_fn_t push_fn, 3154+ DATA_BLOB db, 3155+ size_t struct_size, 3156+ int ndr_flags, 3157+ int flags, 3158+ bool (*check_fn) (struct torture_context *ctx, void *data)) 3159 { 3160 struct torture_test *test; 3161 struct torture_tcase *tcase; 3162@@ -74,12 +99,16 @@ _PUBLIC_ struct torture_test *_torture_s 3163 3164 test->name = talloc_strdup(test, name); 3165 test->description = NULL; 3166- test->run = wrap_ndr_pull_test; 3167+ test->run = wrap_ndr_pullpush_test; 3168+ 3169 data = talloc(test, struct ndr_pull_test_data); 3170 data->data = db; 3171 data->ndr_flags = ndr_flags; 3172+ data->flags = flags; 3173 data->struct_size = struct_size; 3174 data->pull_fn = pull_fn; 3175+ data->push_fn = push_fn; 3176+ 3177 test->data = data; 3178 test->fn = check_fn; 3179 test->dangerous = false; 3180@@ -89,6 +118,7 @@ _PUBLIC_ struct torture_test *_torture_s 3181 return test; 3182 } 3183 3184+ 3185 static bool wrap_ndr_inout_pull_test(struct torture_context *tctx, 3186 struct torture_tcase *tcase, 3187 struct torture_test *test) 3188@@ -97,6 +127,7 @@ static bool wrap_ndr_inout_pull_test(str 3189 const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data; 3190 void *ds = talloc_zero_size(tctx, data->struct_size); 3191 struct ndr_pull *ndr; 3192+ uint32_t highest_ofs; 3193 3194 /* handle NDR_IN context */ 3195 3196@@ -109,8 +140,14 @@ static bool wrap_ndr_inout_pull_test(str 3197 data->pull_fn(ndr, NDR_IN, ds), 3198 "ndr pull of context failed"); 3199 3200- torture_assert(tctx, ndr->offset == ndr->data_size, 3201- talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset)); 3202+ if (ndr->offset > ndr->relative_highest_offset) { 3203+ highest_ofs = ndr->offset; 3204+ } else { 3205+ highest_ofs = ndr->relative_highest_offset; 3206+ } 3207+ 3208+ torture_assert(tctx, highest_ofs == ndr->data_size, 3209+ talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs)); 3210 3211 talloc_free(ndr); 3212 3213@@ -125,8 +162,14 @@ static bool wrap_ndr_inout_pull_test(str 3214 data->pull_fn(ndr, NDR_OUT, ds), 3215 "ndr pull failed"); 3216 3217- torture_assert(tctx, ndr->offset == ndr->data_size, 3218- talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset)); 3219+ if (ndr->offset > ndr->relative_highest_offset) { 3220+ highest_ofs = ndr->offset; 3221+ } else { 3222+ highest_ofs = ndr->relative_highest_offset; 3223+ } 3224+ 3225+ torture_assert(tctx, highest_ofs == ndr->data_size, 3226+ talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs)); 3227 3228 talloc_free(ndr); 3229 3230--- a/source4/torture/ndr/ndr.h 3231+++ b/source4/torture/ndr/ndr.h 3232@@ -24,12 +24,15 @@ 3233 #include "librpc/ndr/libndr.h" 3234 #include "libcli/security/security.h" 3235 3236-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test( 3237+_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( 3238 struct torture_suite *suite, 3239- const char *name, ndr_pull_flags_fn_t fn, 3240+ const char *name, 3241+ ndr_pull_flags_fn_t pull_fn, 3242+ ndr_push_flags_fn_t push_fn, 3243 DATA_BLOB db, 3244 size_t struct_size, 3245 int ndr_flags, 3246+ int flags, 3247 bool (*check_fn) (struct torture_context *, void *data)); 3248 3249 _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( 3250@@ -41,20 +44,32 @@ _PUBLIC_ struct torture_test *_torture_s 3251 bool (*check_fn) (struct torture_context *ctx, void *data)); 3252 3253 #define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \ 3254- _torture_suite_add_ndr_pull_test(suite, #name, \ 3255- (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \ 3256- sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, (bool (*) (struct torture_context *, void *)) check_fn); 3257+ _torture_suite_add_ndr_pullpush_test(suite, #name, \ 3258+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ 3259+ sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn); 3260 3261 #define torture_suite_add_ndr_pull_fn_test(suite,name,data,flags,check_fn) \ 3262- _torture_suite_add_ndr_pull_test(suite, #name "_" #flags, \ 3263- (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \ 3264- sizeof(struct name), flags, (bool (*) (struct torture_context *, void *)) check_fn); 3265+ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \ 3266+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ 3267+ sizeof(struct name), flags, 0, (bool (*) (struct torture_context *, void *)) check_fn); 3268+ 3269+#define torture_suite_add_ndr_pull_fn_test_flags(suite,name,data,flags,flags2,check_fn) \ 3270+ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \ 3271+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ 3272+ sizeof(struct name), flags, flags2, (bool (*) (struct torture_context *, void *)) check_fn); 3273+ 3274+#define torture_suite_add_ndr_pullpush_test(suite,name,data_blob,check_fn) \ 3275+ _torture_suite_add_ndr_pullpush_test(suite, #name, \ 3276+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ 3277+ (ndr_push_flags_fn_t)ndr_push_ ## name, \ 3278+ data_blob, \ 3279+ sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn); 3280 3281 #define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \ 3282 _torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \ 3283 (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ 3284- data_blob_talloc(suite, data_in, sizeof(data_in)), \ 3285- data_blob_talloc(suite, data_out, sizeof(data_out)), \ 3286+ data_blob_const(data_in, sizeof(data_in)), \ 3287+ data_blob_const(data_out, sizeof(data_out)), \ 3288 sizeof(struct name), \ 3289 (bool (*) (struct torture_context *, void *)) check_fn_out); 3290 3291--- a/source4/torture/ndr/dfsblob.c 3292+++ b/source4/torture/ndr/dfsblob.c 3293@@ -74,11 +74,11 @@ struct torture_suite *ndr_dfsblob_suite( 3294 { 3295 struct torture_suite *suite = torture_suite_create(ctx, "dfsblob"); 3296 3297- torture_suite_add_ndr_pull_fn_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NDR_IN, NULL); 3298+ torture_suite_add_ndr_pull_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NULL); 3299 3300- torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out2, NDR_BUFFERS|NDR_SCALARS, NULL); 3301+ torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out2, NULL); 3302 3303- torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out, NDR_BUFFERS|NDR_SCALARS,dfs_referral_out_check); 3304+ torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out,dfs_referral_out_check); 3305 3306 return suite; 3307 } 3308--- a/source4/torture/ndr/nbt.c 3309+++ b/source4/torture/ndr/nbt.c 3310@@ -62,9 +62,9 @@ struct torture_suite *ndr_nbt_suite(TALL 3311 { 3312 struct torture_suite *suite = torture_suite_create(ctx, "nbt"); 3313 3314- torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, NDR_IN, netlogon_logon_request_req_check); 3315+ torture_suite_add_ndr_pull_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, netlogon_logon_request_req_check); 3316 3317- torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, NDR_IN, netlogon_logon_request_resp_check); 3318+ torture_suite_add_ndr_pull_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, netlogon_logon_request_resp_check); 3319 3320 return suite; 3321 } 3322--- a/source4/torture/ndr/ntlmssp.c 3323+++ b/source4/torture/ndr/ntlmssp.c 3324@@ -111,9 +111,10 @@ struct torture_suite *ndr_ntlmssp_suite( 3325 { 3326 struct torture_suite *suite = torture_suite_create(ctx, "ntlmssp"); 3327 3328- torture_suite_add_ndr_pull_fn_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, NDR_IN, ntlmssp_NEGOTIATE_MESSAGE_check); 3329- /* torture_suite_add_ndr_pull_fn_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, NDR_IN, ntlmssp_CHALLENGE_MESSAGE_check); 3330- torture_suite_add_ndr_pull_fn_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, NDR_IN, ntlmssp_AUTHENTICATE_MESSAGE_check); */ 3331- 3332+ torture_suite_add_ndr_pull_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, ntlmssp_NEGOTIATE_MESSAGE_check); 3333+#if 0 3334+ torture_suite_add_ndr_pull_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, ntlmssp_CHALLENGE_MESSAGE_check); 3335+ torture_suite_add_ndr_pull_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, ntlmssp_AUTHENTICATE_MESSAGE_check); 3336+#endif 3337 return suite; 3338 } 3339--- a/source4/torture/ndr/drsblobs.c 3340+++ b/source4/torture/ndr/drsblobs.c 3341@@ -115,6 +115,34 @@ static const uint8_t trust_domain_passwo 3342 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00 3343 }; 3344 3345+/* these are taken from the trust objects of a w2k8r2 forest, with a 3346+ * trust relationship between the forest parent and a child domain 3347+ */ 3348+static const char *trustAuthIncoming = 3349+"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H" 3350+"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+" 3351+"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ" 3352+"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/" 3353+"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3" 3354+"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu" 3355+"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF" 3356+"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ" 3357+"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7" 3358+"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA=="; 3359+ 3360+static const char *trustAuthOutgoing = 3361+"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H" 3362+"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+" 3363+"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ" 3364+"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/" 3365+"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3" 3366+"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu" 3367+"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF" 3368+"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ" 3369+"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7" 3370+"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA=="; 3371+ 3372+ 3373 static bool trust_domain_passwords_check_in(struct torture_context *tctx, 3374 struct trustDomainPasswords *r) 3375 { 3376@@ -154,8 +182,20 @@ struct torture_suite *ndr_drsblobs_suite 3377 { 3378 struct torture_suite *suite = torture_suite_create(ctx, "drsblobs"); 3379 3380- torture_suite_add_ndr_pull_fn_test(suite, ForestTrustInfo, forest_trust_info_data_out, NDR_IN, forest_trust_info_check_out); 3381- torture_suite_add_ndr_pull_fn_test(suite, trustDomainPasswords, trust_domain_passwords_in, NDR_IN, trust_domain_passwords_check_in); 3382+ torture_suite_add_ndr_pull_test(suite, ForestTrustInfo, forest_trust_info_data_out, forest_trust_info_check_out); 3383+ torture_suite_add_ndr_pull_test(suite, trustDomainPasswords, trust_domain_passwords_in, trust_domain_passwords_check_in); 3384+ 3385+#if 0 3386+ torture_suite_add_ndr_pullpush_test(suite, 3387+ trustAuthInOutBlob, 3388+ base64_decode_data_blob_talloc(suite, trustAuthIncoming), 3389+ NULL); 3390+ 3391+ torture_suite_add_ndr_pullpush_test(suite, 3392+ trustAuthInOutBlob, 3393+ base64_decode_data_blob_talloc(suite, trustAuthOutgoing), 3394+ NULL); 3395+#endif 3396 3397 return suite; 3398 } 3399--- a/source3/rpcclient/rpcclient.c 3400+++ b/source3/rpcclient/rpcclient.c 3401@@ -1031,6 +1031,10 @@ out_free: 3402 binding->transport = NCACN_NP; 3403 } 3404 3405+ if (binding->flags & DCERPC_CONNECT) { 3406+ pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT; 3407+ pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP; 3408+ } 3409 if (binding->flags & DCERPC_SIGN) { 3410 pipe_default_auth_level = DCERPC_AUTH_LEVEL_INTEGRITY; 3411 pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP; 3412@@ -1044,12 +1048,6 @@ out_free: 3413 pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP; 3414 } 3415 if (binding->flags & DCERPC_AUTH_NTLM) { 3416- /* If neither Integrity or Privacy are requested then 3417- * Use just Connect level */ 3418- if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) { 3419- pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT; 3420- } 3421- 3422 if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) { 3423 pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP; 3424 } else { 3425@@ -1057,18 +1055,19 @@ out_free: 3426 } 3427 } 3428 if (binding->flags & DCERPC_AUTH_KRB5) { 3429- /* If neither Integrity or Privacy are requested then 3430- * Use just Connect level */ 3431- if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) { 3432- pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT; 3433- } 3434- 3435 if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) { 3436 pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_KRB5; 3437 } else { 3438 pipe_default_auth_type = DCERPC_AUTH_TYPE_KRB5; 3439 } 3440 } 3441+ if (pipe_default_auth_type != DCERPC_AUTH_TYPE_NONE) { 3442+ /* If neither Integrity or Privacy are requested then 3443+ * Use just Connect level */ 3444+ if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) { 3445+ pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT; 3446+ } 3447+ } 3448 3449 if (get_cmdline_auth_info_use_kerberos(rpcclient_auth_info)) { 3450 flags |= CLI_FULL_CONNECTION_USE_KERBEROS | 3451--- /dev/null 3452+++ b/source3/script/tests/test_rpcclient.sh 3453@@ -0,0 +1,19 @@ 3454+#!/bin/sh 3455+ 3456+if [ $# -lt 1 ]; then 3457+cat <<EOF 3458+Usage: test_rpcclient.sh ccache binding <rpcclient commands> 3459+EOF 3460+exit 1; 3461+fi 3462+ 3463+KRB5CCNAME=$1 3464+shift 1 3465+export KRB5CCNAME 3466+ADDARGS="$*" 3467+ 3468+incdir=`dirname $0`/../../../testprogs/blackbox 3469+. $incdir/subunit.sh 3470+testit "rpcclient" $VALGRIND $BINDIR/rpcclient -c 'getusername' $ADDARGS || failed=`expr $failed + 1` 3471+ 3472+testok $0 $failed 3473--- a/source3/selftest/tests.py 3474+++ b/source3/selftest/tests.py 3475@@ -208,7 +208,7 @@ if sub.returncode == 0: 3476 plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmpcase -U$USERNAME%$PASSWORD') 3477 3478 test = 'rpc.lsa.lookupsids' 3479- auth_options = ["", "ntlm", "spnego" ] 3480+ auth_options = ["", "ntlm", "spnego", "spnego,ntlm" ] 3481 signseal_options = ["", ",connect", ",sign", ",seal"] 3482 smb_options = ["", ",smb2"] 3483 endianness_options = ["", ",bigendian"] 3484@@ -219,6 +219,9 @@ if sub.returncode == 0: 3485 binding_string = "ncacn_np:$SERVER_IP[%s%s%s%s]" % (a, s, z, e) 3486 options = binding_string + " -U$USERNAME%$PASSWORD" 3487 plansmbtorturetestsuite(test, "s3dc", options, 'over ncacn_np with [%s%s%s%s] ' % (a, s, z, e)) 3488+ plantestsuite("samba3.blackbox.rpcclient over ncacn_np with [%s%s%s%s] " % (a, s, z, e), "s3dc:local", [os.path.join(samba3srcdir, "script/tests/test_rpcclient.sh"), 3489+ "none", options, configuration]) 3490+ 3491 for e in endianness_options: 3492 for a in auth_options: 3493 for s in signseal_options: 3494--- a/source4/torture/rpc/rpc.c 3495+++ b/source4/torture/rpc/rpc.c 3496@@ -501,6 +501,7 @@ NTSTATUS torture_rpc_init(void) 3497 torture_suite_add_suite(suite, torture_rpc_samr_passwords_pwdlastset(suite)); 3498 torture_suite_add_suite(suite, torture_rpc_samr_passwords_badpwdcount(suite)); 3499 torture_suite_add_suite(suite, torture_rpc_samr_passwords_lockout(suite)); 3500+ torture_suite_add_suite(suite, torture_rpc_samr_passwords_validate(suite)); 3501 torture_suite_add_suite(suite, torture_rpc_samr_user_privileges(suite)); 3502 torture_suite_add_suite(suite, torture_rpc_samr_large_dc(suite)); 3503 torture_suite_add_suite(suite, torture_rpc_epmapper(suite)); 3504--- a/source4/torture/rpc/samr.c 3505+++ b/source4/torture/rpc/samr.c 3506@@ -7938,8 +7938,8 @@ static bool test_Connect(struct dcerpc_b 3507 } 3508 3509 3510-static bool test_samr_ValidatePassword(struct dcerpc_pipe *p, 3511- struct torture_context *tctx) 3512+static bool test_samr_ValidatePassword(struct torture_context *tctx, 3513+ struct dcerpc_pipe *p) 3514 { 3515 struct samr_ValidatePassword r; 3516 union samr_ValidatePasswordReq req; 3517@@ -7951,6 +7951,10 @@ static bool test_samr_ValidatePassword(s 3518 3519 torture_comment(tctx, "Testing samr_ValidatePassword\n"); 3520 3521+ if (p->conn->transport.transport != NCACN_IP_TCP) { 3522+ torture_comment(tctx, "samr_ValidatePassword only should succeed over NCACN_IP_TCP!\n"); 3523+ } 3524+ 3525 ZERO_STRUCT(r); 3526 r.in.level = NetValidatePasswordReset; 3527 r.in.req = &req; 3528@@ -8074,8 +8078,6 @@ bool torture_rpc_samr_passwords(struct t 3529 3530 ret &= test_samr_handle_Close(b, torture, &ctx->handle); 3531 3532- ret &= test_samr_ValidatePassword(p, torture); 3533- 3534 return ret; 3535 } 3536 3537@@ -8370,4 +8372,15 @@ struct torture_suite *torture_rpc_samr_p 3538 return suite; 3539 } 3540 3541+struct torture_suite *torture_rpc_samr_passwords_validate(TALLOC_CTX *mem_ctx) 3542+{ 3543+ struct torture_suite *suite = torture_suite_create(mem_ctx, "samr.passwords.validate"); 3544+ struct torture_rpc_tcase *tcase; 3545+ 3546+ tcase = torture_suite_add_rpc_iface_tcase(suite, "samr", 3547+ &ndr_table_samr); 3548+ torture_rpc_tcase_add_test(tcase, "validate", 3549+ test_samr_ValidatePassword); 3550 3551+ return suite; 3552+} 3553--- a/source3/rpc_server/srv_pipe.c 3554+++ b/source3/rpc_server/srv_pipe.c 3555@@ -42,6 +42,7 @@ 3556 #include "auth.h" 3557 #include "ntdomain.h" 3558 #include "rpc_server/srv_pipe.h" 3559+#include "../librpc/ndr/ndr_dcerpc.h" 3560 3561 #undef DBGC_CLASS 3562 #define DBGC_CLASS DBGC_RPC_SRV 3563@@ -202,7 +203,7 @@ bool create_next_pdu(struct pipes_struct 3564 * the pipe gets closed. JRA. 3565 */ 3566 if (p->fault_state) { 3567- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR)); 3568+ setup_fault_pdu(p, NT_STATUS(p->fault_state)); 3569 return true; 3570 } 3571 3572@@ -336,7 +337,7 @@ static bool check_bind_req(struct pipes_ 3573 struct pipe_rpc_fns *context_fns; 3574 3575 DEBUG(3,("check_bind_req for %s\n", 3576- get_pipe_name_from_syntax(talloc_tos(), &p->syntax))); 3577+ get_pipe_name_from_syntax(talloc_tos(), abstract))); 3578 3579 /* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */ 3580 if (rpc_srv_pipe_exists_by_id(abstract) && 3581@@ -358,6 +359,7 @@ static bool check_bind_req(struct pipes_ 3582 context_fns->n_cmds = rpc_srv_get_pipe_num_cmds(abstract); 3583 context_fns->cmds = rpc_srv_get_pipe_cmds(abstract); 3584 context_fns->context_id = context_id; 3585+ context_fns->syntax = *abstract; 3586 3587 /* add to the list of open contexts */ 3588 3589@@ -1541,7 +1543,42 @@ static PIPE_RPC_FNS* find_pipe_fns_by_co 3590 } 3591 3592 static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt, 3593- const struct api_struct *api_rpc_cmds, int n_cmds); 3594+ const struct api_struct *api_rpc_cmds, int n_cmds, 3595+ const struct ndr_syntax_id *syntax); 3596+ 3597+static bool srv_pipe_check_verification_trailer(struct pipes_struct *p, 3598+ struct ncacn_packet *pkt, 3599+ struct pipe_rpc_fns *pipe_fns) 3600+{ 3601+ TALLOC_CTX *frame = talloc_stackframe(); 3602+ struct dcerpc_sec_verification_trailer *vt = NULL; 3603+ const uint32_t bitmask1 = 0; 3604+ const struct dcerpc_sec_vt_pcontext pcontext = { 3605+ .abstract_syntax = pipe_fns->syntax, 3606+ .transfer_syntax = ndr_transfer_syntax, 3607+ }; 3608+ const struct dcerpc_sec_vt_header2 header2 = 3609+ dcerpc_sec_vt_header2_from_ncacn_packet(pkt); 3610+ struct ndr_pull *ndr; 3611+ enum ndr_err_code ndr_err; 3612+ bool ret = false; 3613+ 3614+ ndr = ndr_pull_init_blob(&p->in_data.data, frame); 3615+ if (ndr == NULL) { 3616+ goto done; 3617+ } 3618+ 3619+ ndr_err = ndr_pop_dcerpc_sec_verification_trailer(ndr, frame, &vt); 3620+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { 3621+ goto done; 3622+ } 3623+ 3624+ ret = dcerpc_sec_verification_trailer_check(vt, &bitmask1, 3625+ &pcontext, &header2); 3626+done: 3627+ TALLOC_FREE(frame); 3628+ return ret; 3629+} 3630 3631 /**************************************************************************** 3632 Find the correct RPC function to call for this request. 3633@@ -1552,46 +1589,53 @@ static bool api_rpcTNP(struct pipes_stru 3634 static bool api_pipe_request(struct pipes_struct *p, 3635 struct ncacn_packet *pkt) 3636 { 3637+ TALLOC_CTX *frame = talloc_stackframe(); 3638 bool ret = False; 3639- bool changed_user = False; 3640 PIPE_RPC_FNS *pipe_fns; 3641 3642- if (p->pipe_bound && 3643- ((p->auth.auth_type == DCERPC_AUTH_TYPE_NTLMSSP) || 3644- (p->auth.auth_type == DCERPC_AUTH_TYPE_KRB5) || 3645- (p->auth.auth_type == DCERPC_AUTH_TYPE_SPNEGO))) { 3646- if(!become_authenticated_pipe_user(p->session_info)) { 3647- data_blob_free(&p->out_data.rdata); 3648- return False; 3649- } 3650- changed_user = True; 3651+ if (!p->pipe_bound) { 3652+ DEBUG(1, ("Pipe not bound!\n")); 3653+ data_blob_free(&p->out_data.rdata); 3654+ TALLOC_FREE(frame); 3655+ return false; 3656 } 3657 3658- DEBUG(5, ("Requested \\PIPE\\%s\n", 3659- get_pipe_name_from_syntax(talloc_tos(), &p->syntax))); 3660- 3661 /* get the set of RPC functions for this context */ 3662 3663 pipe_fns = find_pipe_fns_by_context(p->contexts, 3664 pkt->u.request.context_id); 3665- 3666- if ( pipe_fns ) { 3667- TALLOC_CTX *frame = talloc_stackframe(); 3668- ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds); 3669+ if (pipe_fns == NULL) { 3670+ DEBUG(0, ("No rpc function table associated with context " 3671+ "[%d]\n", 3672+ pkt->u.request.context_id)); 3673+ data_blob_free(&p->out_data.rdata); 3674 TALLOC_FREE(frame); 3675+ return false; 3676 } 3677- else { 3678- DEBUG(0, ("No rpc function table associated with context " 3679- "[%d] on pipe [%s]\n", 3680- pkt->u.request.context_id, 3681- get_pipe_name_from_syntax(talloc_tos(), 3682- &p->syntax))); 3683+ 3684+ DEBUG(5, ("Requested \\PIPE\\%s\n", 3685+ get_pipe_name_from_syntax(talloc_tos(), &pipe_fns->syntax))); 3686+ 3687+ if (!srv_pipe_check_verification_trailer(p, pkt, pipe_fns)) { 3688+ DEBUG(1, ("srv_pipe_check_verification_trailer: failed\n")); 3689+ setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_ACCESS_DENIED)); 3690+ data_blob_free(&p->out_data.rdata); 3691+ TALLOC_FREE(frame); 3692+ return true; 3693 } 3694 3695- if (changed_user) { 3696- unbecome_authenticated_pipe_user(); 3697+ if (!become_authenticated_pipe_user(p->session_info)) { 3698+ DEBUG(1, ("Failed to become pipe user!\n")); 3699+ data_blob_free(&p->out_data.rdata); 3700+ TALLOC_FREE(frame); 3701+ return false; 3702 } 3703 3704+ ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds, 3705+ &pipe_fns->syntax); 3706+ unbecome_authenticated_pipe_user(); 3707+ 3708+ TALLOC_FREE(frame); 3709 return ret; 3710 } 3711 3712@@ -1600,20 +1644,21 @@ static bool api_pipe_request(struct pipe 3713 ********************************************************************/ 3714 3715 static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt, 3716- const struct api_struct *api_rpc_cmds, int n_cmds) 3717+ const struct api_struct *api_rpc_cmds, int n_cmds, 3718+ const struct ndr_syntax_id *syntax) 3719 { 3720 int fn_num; 3721 uint32_t offset1; 3722 3723 /* interpret the command */ 3724 DEBUG(4,("api_rpcTNP: %s op 0x%x - ", 3725- get_pipe_name_from_syntax(talloc_tos(), &p->syntax), 3726+ get_pipe_name_from_syntax(talloc_tos(), syntax), 3727 pkt->u.request.opnum)); 3728 3729 if (DEBUGLEVEL >= 50) { 3730 fstring name; 3731 slprintf(name, sizeof(name)-1, "in_%s", 3732- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)); 3733+ get_pipe_name_from_syntax(talloc_tos(), syntax)); 3734 dump_pdu_region(name, pkt->u.request.opnum, 3735 &p->in_data.data, 0, 3736 p->in_data.data.length); 3737@@ -1646,37 +1691,30 @@ static bool api_rpcTNP(struct pipes_stru 3738 /* do the actual command */ 3739 if(!api_rpc_cmds[fn_num].fn(p)) { 3740 DEBUG(0,("api_rpcTNP: %s: %s failed.\n", 3741- get_pipe_name_from_syntax(talloc_tos(), &p->syntax), 3742+ get_pipe_name_from_syntax(talloc_tos(), syntax), 3743 api_rpc_cmds[fn_num].name)); 3744 data_blob_free(&p->out_data.rdata); 3745 return False; 3746 } 3747 3748- if (p->bad_handle_fault_state) { 3749- DEBUG(4,("api_rpcTNP: bad handle fault return.\n")); 3750- p->bad_handle_fault_state = False; 3751- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_CONTEXT_MISMATCH)); 3752- return True; 3753- } 3754- 3755- if (p->rng_fault_state) { 3756- DEBUG(4, ("api_rpcTNP: rng fault return\n")); 3757- p->rng_fault_state = False; 3758- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR)); 3759- return True; 3760+ if (p->fault_state) { 3761+ DEBUG(4,("api_rpcTNP: fault(%d) return.\n", p->fault_state)); 3762+ setup_fault_pdu(p, NT_STATUS(p->fault_state)); 3763+ p->fault_state = 0; 3764+ return true; 3765 } 3766 3767 if (DEBUGLEVEL >= 50) { 3768 fstring name; 3769 slprintf(name, sizeof(name)-1, "out_%s", 3770- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)); 3771+ get_pipe_name_from_syntax(talloc_tos(), syntax)); 3772 dump_pdu_region(name, pkt->u.request.opnum, 3773 &p->out_data.rdata, offset1, 3774 p->out_data.rdata.length); 3775 } 3776 3777 DEBUG(5,("api_rpcTNP: called %s successfully\n", 3778- get_pipe_name_from_syntax(talloc_tos(), &p->syntax))); 3779+ get_pipe_name_from_syntax(talloc_tos(), syntax))); 3780 3781 /* Check for buffer underflow in rpc parsing */ 3782 if ((DEBUGLEVEL >= 10) && 3783@@ -1718,9 +1756,9 @@ void set_incoming_fault(struct pipes_str 3784 data_blob_free(&p->in_data.data); 3785 p->in_data.pdu_needed_len = 0; 3786 p->in_data.pdu.length = 0; 3787- p->fault_state = True; 3788- DEBUG(10, ("set_incoming_fault: Setting fault state on pipe %s\n", 3789- get_pipe_name_from_syntax(talloc_tos(), &p->syntax))); 3790+ p->fault_state = DCERPC_FAULT_CANT_PERFORM; 3791+ 3792+ DEBUG(10, ("Setting fault state\n")); 3793 } 3794 3795 static NTSTATUS dcesrv_auth_request(struct pipe_auth_data *auth, 3796--- a/source3/include/ntdomain.h 3797+++ b/source3/include/ntdomain.h 3798@@ -87,6 +87,7 @@ typedef struct pipe_rpc_fns { 3799 const struct api_struct *cmds; 3800 int n_cmds; 3801 uint32 context_id; 3802+ struct ndr_syntax_id syntax; 3803 3804 } PIPE_RPC_FNS; 3805 3806@@ -134,22 +135,10 @@ struct pipes_struct { 3807 bool pipe_bound; 3808 3809 /* 3810- * Set to true when we should return fault PDU's for everything. 3811- */ 3812- 3813- bool fault_state; 3814- 3815- /* 3816- * Set to true when we should return fault PDU's for a bad handle. 3817- */ 3818- 3819- bool bad_handle_fault_state; 3820- 3821- /* 3822- * Set to true when the backend does not support a call. 3823+ * Set the DCERPC_FAULT to return. 3824 */ 3825 3826- bool rng_fault_state; 3827+ int fault_state; 3828 3829 /* 3830 * Set to RPC_BIG_ENDIAN when dealing with big-endian PDU's 3831--- a/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm 3832+++ b/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm 3833@@ -183,7 +183,7 @@ sub ParseFunction($$) 3834 ); 3835 3836 pidl ""; 3837- pidl "if (p->rng_fault_state) {"; 3838+ pidl "if (p->fault_state) {"; 3839 pidl "\ttalloc_free(r);"; 3840 pidl "\t/* Return true here, srv_pipe_hnd.c will take care */"; 3841 pidl "\treturn true;"; 3842--- a/source3/rpc_server/dfs/srv_dfs_nt.c 3843+++ b/source3/rpc_server/dfs/srv_dfs_nt.c 3844@@ -411,125 +411,125 @@ WERROR _dfs_GetInfo(struct pipes_struct 3845 WERROR _dfs_SetInfo(struct pipes_struct *p, struct dfs_SetInfo *r) 3846 { 3847 /* FIXME: Implement your code here */ 3848- p->rng_fault_state = True; 3849+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3850 return WERR_NOT_SUPPORTED; 3851 } 3852 3853 WERROR _dfs_Rename(struct pipes_struct *p, struct dfs_Rename *r) 3854 { 3855 /* FIXME: Implement your code here */ 3856- p->rng_fault_state = True; 3857+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3858 return WERR_NOT_SUPPORTED; 3859 } 3860 3861 WERROR _dfs_Move(struct pipes_struct *p, struct dfs_Move *r) 3862 { 3863 /* FIXME: Implement your code here */ 3864- p->rng_fault_state = True; 3865+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3866 return WERR_NOT_SUPPORTED; 3867 } 3868 3869 WERROR _dfs_ManagerGetConfigInfo(struct pipes_struct *p, struct dfs_ManagerGetConfigInfo *r) 3870 { 3871 /* FIXME: Implement your code here */ 3872- p->rng_fault_state = True; 3873+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3874 return WERR_NOT_SUPPORTED; 3875 } 3876 3877 WERROR _dfs_ManagerSendSiteInfo(struct pipes_struct *p, struct dfs_ManagerSendSiteInfo *r) 3878 { 3879 /* FIXME: Implement your code here */ 3880- p->rng_fault_state = True; 3881+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3882 return WERR_NOT_SUPPORTED; 3883 } 3884 3885 WERROR _dfs_AddFtRoot(struct pipes_struct *p, struct dfs_AddFtRoot *r) 3886 { 3887 /* FIXME: Implement your code here */ 3888- p->rng_fault_state = True; 3889+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3890 return WERR_NOT_SUPPORTED; 3891 } 3892 3893 WERROR _dfs_RemoveFtRoot(struct pipes_struct *p, struct dfs_RemoveFtRoot *r) 3894 { 3895 /* FIXME: Implement your code here */ 3896- p->rng_fault_state = True; 3897+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3898 return WERR_NOT_SUPPORTED; 3899 } 3900 3901 WERROR _dfs_AddStdRoot(struct pipes_struct *p, struct dfs_AddStdRoot *r) 3902 { 3903 /* FIXME: Implement your code here */ 3904- p->rng_fault_state = True; 3905+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3906 return WERR_NOT_SUPPORTED; 3907 } 3908 3909 WERROR _dfs_RemoveStdRoot(struct pipes_struct *p, struct dfs_RemoveStdRoot *r) 3910 { 3911 /* FIXME: Implement your code here */ 3912- p->rng_fault_state = True; 3913+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3914 return WERR_NOT_SUPPORTED; 3915 } 3916 3917 WERROR _dfs_ManagerInitialize(struct pipes_struct *p, struct dfs_ManagerInitialize *r) 3918 { 3919 /* FIXME: Implement your code here */ 3920- p->rng_fault_state = True; 3921+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3922 return WERR_NOT_SUPPORTED; 3923 } 3924 3925 WERROR _dfs_AddStdRootForced(struct pipes_struct *p, struct dfs_AddStdRootForced *r) 3926 { 3927 /* FIXME: Implement your code here */ 3928- p->rng_fault_state = True; 3929+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3930 return WERR_NOT_SUPPORTED; 3931 } 3932 3933 WERROR _dfs_GetDcAddress(struct pipes_struct *p, struct dfs_GetDcAddress *r) 3934 { 3935 /* FIXME: Implement your code here */ 3936- p->rng_fault_state = True; 3937+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3938 return WERR_NOT_SUPPORTED; 3939 } 3940 3941 WERROR _dfs_SetDcAddress(struct pipes_struct *p, struct dfs_SetDcAddress *r) 3942 { 3943 /* FIXME: Implement your code here */ 3944- p->rng_fault_state = True; 3945+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3946 return WERR_NOT_SUPPORTED; 3947 } 3948 3949 WERROR _dfs_FlushFtTable(struct pipes_struct *p, struct dfs_FlushFtTable *r) 3950 { 3951 /* FIXME: Implement your code here */ 3952- p->rng_fault_state = True; 3953+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3954 return WERR_NOT_SUPPORTED; 3955 } 3956 3957 WERROR _dfs_Add2(struct pipes_struct *p, struct dfs_Add2 *r) 3958 { 3959 /* FIXME: Implement your code here */ 3960- p->rng_fault_state = True; 3961+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3962 return WERR_NOT_SUPPORTED; 3963 } 3964 3965 WERROR _dfs_Remove2(struct pipes_struct *p, struct dfs_Remove2 *r) 3966 { 3967 /* FIXME: Implement your code here */ 3968- p->rng_fault_state = True; 3969+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3970 return WERR_NOT_SUPPORTED; 3971 } 3972 3973 WERROR _dfs_EnumEx(struct pipes_struct *p, struct dfs_EnumEx *r) 3974 { 3975 /* FIXME: Implement your code here */ 3976- p->rng_fault_state = True; 3977+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3978 return WERR_NOT_SUPPORTED; 3979 } 3980 3981 WERROR _dfs_SetInfo2(struct pipes_struct *p, struct dfs_SetInfo2 *r) 3982 { 3983 /* FIXME: Implement your code here */ 3984- p->rng_fault_state = True; 3985+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3986 return WERR_NOT_SUPPORTED; 3987 } 3988--- a/source3/rpc_server/dssetup/srv_dssetup_nt.c 3989+++ b/source3/rpc_server/dssetup/srv_dssetup_nt.c 3990@@ -130,7 +130,7 @@ WERROR _dssetup_DsRoleGetPrimaryDomainIn 3991 WERROR _dssetup_DsRoleDnsNameToFlatName(struct pipes_struct *p, 3992 struct dssetup_DsRoleDnsNameToFlatName *r) 3993 { 3994- p->rng_fault_state = true; 3995+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 3996 return WERR_NOT_SUPPORTED; 3997 } 3998 3999@@ -140,7 +140,7 @@ WERROR _dssetup_DsRoleDnsNameToFlatName( 4000 WERROR _dssetup_DsRoleDcAsDc(struct pipes_struct *p, 4001 struct dssetup_DsRoleDcAsDc *r) 4002 { 4003- p->rng_fault_state = true; 4004+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4005 return WERR_NOT_SUPPORTED; 4006 } 4007 4008@@ -150,7 +150,7 @@ WERROR _dssetup_DsRoleDcAsDc(struct pipe 4009 WERROR _dssetup_DsRoleDcAsReplica(struct pipes_struct *p, 4010 struct dssetup_DsRoleDcAsReplica *r) 4011 { 4012- p->rng_fault_state = true; 4013+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4014 return WERR_NOT_SUPPORTED; 4015 } 4016 4017@@ -160,7 +160,7 @@ WERROR _dssetup_DsRoleDcAsReplica(struct 4018 WERROR _dssetup_DsRoleDemoteDc(struct pipes_struct *p, 4019 struct dssetup_DsRoleDemoteDc *r) 4020 { 4021- p->rng_fault_state = true; 4022+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4023 return WERR_NOT_SUPPORTED; 4024 } 4025 4026@@ -170,7 +170,7 @@ WERROR _dssetup_DsRoleDemoteDc(struct pi 4027 WERROR _dssetup_DsRoleGetDcOperationProgress(struct pipes_struct *p, 4028 struct dssetup_DsRoleGetDcOperationProgress *r) 4029 { 4030- p->rng_fault_state = true; 4031+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4032 return WERR_NOT_SUPPORTED; 4033 } 4034 4035@@ -180,7 +180,7 @@ WERROR _dssetup_DsRoleGetDcOperationProg 4036 WERROR _dssetup_DsRoleGetDcOperationResults(struct pipes_struct *p, 4037 struct dssetup_DsRoleGetDcOperationResults *r) 4038 { 4039- p->rng_fault_state = true; 4040+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4041 return WERR_NOT_SUPPORTED; 4042 } 4043 4044@@ -190,7 +190,7 @@ WERROR _dssetup_DsRoleGetDcOperationResu 4045 WERROR _dssetup_DsRoleCancel(struct pipes_struct *p, 4046 struct dssetup_DsRoleCancel *r) 4047 { 4048- p->rng_fault_state = true; 4049+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4050 return WERR_NOT_SUPPORTED; 4051 } 4052 4053@@ -200,7 +200,7 @@ WERROR _dssetup_DsRoleCancel(struct pipe 4054 WERROR _dssetup_DsRoleServerSaveStateForUpgrade(struct pipes_struct *p, 4055 struct dssetup_DsRoleServerSaveStateForUpgrade *r) 4056 { 4057- p->rng_fault_state = true; 4058+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4059 return WERR_NOT_SUPPORTED; 4060 } 4061 4062@@ -210,7 +210,7 @@ WERROR _dssetup_DsRoleServerSaveStateFor 4063 WERROR _dssetup_DsRoleUpgradeDownlevelServer(struct pipes_struct *p, 4064 struct dssetup_DsRoleUpgradeDownlevelServer *r) 4065 { 4066- p->rng_fault_state = true; 4067+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4068 return WERR_NOT_SUPPORTED; 4069 } 4070 4071@@ -220,6 +220,6 @@ WERROR _dssetup_DsRoleUpgradeDownlevelSe 4072 WERROR _dssetup_DsRoleAbortDownlevelServerUpgrade(struct pipes_struct *p, 4073 struct dssetup_DsRoleAbortDownlevelServerUpgrade *r) 4074 { 4075- p->rng_fault_state = true; 4076+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4077 return WERR_NOT_SUPPORTED; 4078 } 4079--- a/source3/rpc_server/echo/srv_echo_nt.c 4080+++ b/source3/rpc_server/echo/srv_echo_nt.c 4081@@ -87,13 +87,13 @@ void _echo_SourceData(struct pipes_struc 4082 4083 void _echo_TestCall(struct pipes_struct *p, struct echo_TestCall *r) 4084 { 4085- p->rng_fault_state = True; 4086+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4087 return; 4088 } 4089 4090 NTSTATUS _echo_TestCall2(struct pipes_struct *p, struct echo_TestCall2 *r) 4091 { 4092- p->rng_fault_state = True; 4093+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4094 return NT_STATUS_OK; 4095 } 4096 4097@@ -105,18 +105,18 @@ uint32 _echo_TestSleep(struct pipes_stru 4098 4099 void _echo_TestEnum(struct pipes_struct *p, struct echo_TestEnum *r) 4100 { 4101- p->rng_fault_state = True; 4102+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4103 return; 4104 } 4105 4106 void _echo_TestSurrounding(struct pipes_struct *p, struct echo_TestSurrounding *r) 4107 { 4108- p->rng_fault_state = True; 4109+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4110 return; 4111 } 4112 4113 uint16 _echo_TestDoublePointer(struct pipes_struct *p, struct echo_TestDoublePointer *r) 4114 { 4115- p->rng_fault_state = True; 4116+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4117 return 0; 4118 } 4119--- a/source3/rpc_server/epmapper/srv_epmapper.c 4120+++ b/source3/rpc_server/epmapper/srv_epmapper.c 4121@@ -297,6 +297,7 @@ error_status_t _epm_Insert(struct pipes_ 4122 /* If this is not a priviledged users, return */ 4123 if (p->transport != NCALRPC || 4124 !is_priviledged_pipe(p->session_info)) { 4125+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4126 return EPMAPPER_STATUS_CANT_PERFORM_OP; 4127 } 4128 4129@@ -433,6 +434,7 @@ error_status_t _epm_Delete(struct pipes_ 4130 /* If this is not a priviledged users, return */ 4131 if (p->transport != NCALRPC || 4132 !is_priviledged_pipe(p->session_info)) { 4133+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4134 return EPMAPPER_STATUS_CANT_PERFORM_OP; 4135 } 4136 4137@@ -1096,7 +1098,7 @@ error_status_t _epm_LookupHandleFree(str 4138 error_status_t _epm_InqObject(struct pipes_struct *p, 4139 struct epm_InqObject *r) 4140 { 4141- p->rng_fault_state = true; 4142+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4143 return EPMAPPER_STATUS_CANT_PERFORM_OP; 4144 } 4145 4146@@ -1110,7 +1112,7 @@ error_status_t _epm_InqObject(struct pip 4147 error_status_t _epm_MgmtDelete(struct pipes_struct *p, 4148 struct epm_MgmtDelete *r) 4149 { 4150- p->rng_fault_state = true; 4151+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4152 return EPMAPPER_STATUS_CANT_PERFORM_OP; 4153 } 4154 4155@@ -1121,7 +1123,7 @@ error_status_t _epm_MgmtDelete(struct pi 4156 error_status_t _epm_MapAuth(struct pipes_struct *p, 4157 struct epm_MapAuth *r) 4158 { 4159- p->rng_fault_state = true; 4160+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4161 return EPMAPPER_STATUS_CANT_PERFORM_OP; 4162 } 4163 4164--- a/source3/rpc_server/eventlog/srv_eventlog_nt.c 4165+++ b/source3/rpc_server/eventlog/srv_eventlog_nt.c 4166@@ -695,7 +695,7 @@ NTSTATUS _eventlog_GetNumRecords(struct 4167 4168 NTSTATUS _eventlog_BackupEventLogW(struct pipes_struct *p, struct eventlog_BackupEventLogW *r) 4169 { 4170- p->rng_fault_state = True; 4171+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4172 return NT_STATUS_NOT_IMPLEMENTED; 4173 } 4174 4175@@ -838,104 +838,104 @@ NTSTATUS _eventlog_ReportEventW(struct p 4176 NTSTATUS _eventlog_DeregisterEventSource(struct pipes_struct *p, 4177 struct eventlog_DeregisterEventSource *r) 4178 { 4179- p->rng_fault_state = True; 4180+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4181 return NT_STATUS_NOT_IMPLEMENTED; 4182 } 4183 4184 NTSTATUS _eventlog_ChangeNotify(struct pipes_struct *p, 4185 struct eventlog_ChangeNotify *r) 4186 { 4187- p->rng_fault_state = True; 4188+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4189 return NT_STATUS_NOT_IMPLEMENTED; 4190 } 4191 4192 NTSTATUS _eventlog_RegisterEventSourceW(struct pipes_struct *p, 4193 struct eventlog_RegisterEventSourceW *r) 4194 { 4195- p->rng_fault_state = True; 4196+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4197 return NT_STATUS_NOT_IMPLEMENTED; 4198 } 4199 4200 NTSTATUS _eventlog_OpenBackupEventLogW(struct pipes_struct *p, 4201 struct eventlog_OpenBackupEventLogW *r) 4202 { 4203- p->rng_fault_state = True; 4204+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4205 return NT_STATUS_NOT_IMPLEMENTED; 4206 } 4207 4208 NTSTATUS _eventlog_ClearEventLogA(struct pipes_struct *p, 4209 struct eventlog_ClearEventLogA *r) 4210 { 4211- p->rng_fault_state = True; 4212+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4213 return NT_STATUS_NOT_IMPLEMENTED; 4214 } 4215 4216 NTSTATUS _eventlog_BackupEventLogA(struct pipes_struct *p, 4217 struct eventlog_BackupEventLogA *r) 4218 { 4219- p->rng_fault_state = True; 4220+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4221 return NT_STATUS_NOT_IMPLEMENTED; 4222 } 4223 4224 NTSTATUS _eventlog_OpenEventLogA(struct pipes_struct *p, 4225 struct eventlog_OpenEventLogA *r) 4226 { 4227- p->rng_fault_state = True; 4228+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4229 return NT_STATUS_NOT_IMPLEMENTED; 4230 } 4231 4232 NTSTATUS _eventlog_RegisterEventSourceA(struct pipes_struct *p, 4233 struct eventlog_RegisterEventSourceA *r) 4234 { 4235- p->rng_fault_state = True; 4236+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4237 return NT_STATUS_NOT_IMPLEMENTED; 4238 } 4239 4240 NTSTATUS _eventlog_OpenBackupEventLogA(struct pipes_struct *p, 4241 struct eventlog_OpenBackupEventLogA *r) 4242 { 4243- p->rng_fault_state = True; 4244+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4245 return NT_STATUS_NOT_IMPLEMENTED; 4246 } 4247 4248 NTSTATUS _eventlog_ReadEventLogA(struct pipes_struct *p, 4249 struct eventlog_ReadEventLogA *r) 4250 { 4251- p->rng_fault_state = True; 4252+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4253 return NT_STATUS_NOT_IMPLEMENTED; 4254 } 4255 4256 NTSTATUS _eventlog_ReportEventA(struct pipes_struct *p, 4257 struct eventlog_ReportEventA *r) 4258 { 4259- p->rng_fault_state = True; 4260+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4261 return NT_STATUS_NOT_IMPLEMENTED; 4262 } 4263 4264 NTSTATUS _eventlog_RegisterClusterSvc(struct pipes_struct *p, 4265 struct eventlog_RegisterClusterSvc *r) 4266 { 4267- p->rng_fault_state = True; 4268+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4269 return NT_STATUS_NOT_IMPLEMENTED; 4270 } 4271 4272 NTSTATUS _eventlog_DeregisterClusterSvc(struct pipes_struct *p, 4273 struct eventlog_DeregisterClusterSvc *r) 4274 { 4275- p->rng_fault_state = True; 4276+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4277 return NT_STATUS_NOT_IMPLEMENTED; 4278 } 4279 4280 NTSTATUS _eventlog_WriteClusterEvents(struct pipes_struct *p, 4281 struct eventlog_WriteClusterEvents *r) 4282 { 4283- p->rng_fault_state = True; 4284+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4285 return NT_STATUS_NOT_IMPLEMENTED; 4286 } 4287 4288 NTSTATUS _eventlog_ReportEventAndSourceW(struct pipes_struct *p, 4289 struct eventlog_ReportEventAndSourceW *r) 4290 { 4291- p->rng_fault_state = True; 4292+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4293 return NT_STATUS_NOT_IMPLEMENTED; 4294 } 4295--- a/source3/rpc_server/lsa/srv_lsa_nt.c 4296+++ b/source3/rpc_server/lsa/srv_lsa_nt.c 4297@@ -817,7 +817,7 @@ NTSTATUS _lsa_QueryInfoPolicy2(struct pi 4298 struct lsa_QueryInfoPolicy r; 4299 4300 if ((pdb_capabilities() & PDB_CAP_ADS) == 0) { 4301- p->rng_fault_state = True; 4302+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4303 return NT_STATUS_NOT_IMPLEMENTED; 4304 } 4305 4306@@ -3210,88 +3210,88 @@ NTSTATUS _lsa_Delete(struct pipes_struct 4307 4308 NTSTATUS _lsa_SetSecObj(struct pipes_struct *p, struct lsa_SetSecObj *r) 4309 { 4310- p->rng_fault_state = True; 4311+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4312 return NT_STATUS_NOT_IMPLEMENTED; 4313 } 4314 4315 NTSTATUS _lsa_ChangePassword(struct pipes_struct *p, 4316 struct lsa_ChangePassword *r) 4317 { 4318- p->rng_fault_state = True; 4319+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4320 return NT_STATUS_NOT_IMPLEMENTED; 4321 } 4322 4323 NTSTATUS _lsa_SetInfoPolicy(struct pipes_struct *p, struct lsa_SetInfoPolicy *r) 4324 { 4325- p->rng_fault_state = True; 4326+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4327 return NT_STATUS_NOT_IMPLEMENTED; 4328 } 4329 4330 NTSTATUS _lsa_ClearAuditLog(struct pipes_struct *p, struct lsa_ClearAuditLog *r) 4331 { 4332- p->rng_fault_state = True; 4333+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4334 return NT_STATUS_NOT_IMPLEMENTED; 4335 } 4336 4337 NTSTATUS _lsa_GetQuotasForAccount(struct pipes_struct *p, 4338 struct lsa_GetQuotasForAccount *r) 4339 { 4340- p->rng_fault_state = True; 4341+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4342 return NT_STATUS_NOT_IMPLEMENTED; 4343 } 4344 4345 NTSTATUS _lsa_SetQuotasForAccount(struct pipes_struct *p, 4346 struct lsa_SetQuotasForAccount *r) 4347 { 4348- p->rng_fault_state = True; 4349+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4350 return NT_STATUS_NOT_IMPLEMENTED; 4351 } 4352 4353 NTSTATUS _lsa_SetInformationTrustedDomain(struct pipes_struct *p, 4354 struct lsa_SetInformationTrustedDomain *r) 4355 { 4356- p->rng_fault_state = True; 4357+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4358 return NT_STATUS_NOT_IMPLEMENTED; 4359 } 4360 4361 NTSTATUS _lsa_QuerySecret(struct pipes_struct *p, struct lsa_QuerySecret *r) 4362 { 4363- p->rng_fault_state = True; 4364+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4365 return NT_STATUS_NOT_IMPLEMENTED; 4366 } 4367 4368 NTSTATUS _lsa_SetTrustedDomainInfo(struct pipes_struct *p, 4369 struct lsa_SetTrustedDomainInfo *r) 4370 { 4371- p->rng_fault_state = True; 4372+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4373 return NT_STATUS_NOT_IMPLEMENTED; 4374 } 4375 4376 NTSTATUS _lsa_StorePrivateData(struct pipes_struct *p, 4377 struct lsa_StorePrivateData *r) 4378 { 4379- p->rng_fault_state = True; 4380+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4381 return NT_STATUS_NOT_IMPLEMENTED; 4382 } 4383 4384 NTSTATUS _lsa_RetrievePrivateData(struct pipes_struct *p, 4385 struct lsa_RetrievePrivateData *r) 4386 { 4387- p->rng_fault_state = True; 4388+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4389 return NT_STATUS_NOT_IMPLEMENTED; 4390 } 4391 4392 NTSTATUS _lsa_SetInfoPolicy2(struct pipes_struct *p, 4393 struct lsa_SetInfoPolicy2 *r) 4394 { 4395- p->rng_fault_state = True; 4396+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4397 return NT_STATUS_NOT_IMPLEMENTED; 4398 } 4399 4400 NTSTATUS _lsa_SetTrustedDomainInfoByName(struct pipes_struct *p, 4401 struct lsa_SetTrustedDomainInfoByName *r) 4402 { 4403- p->rng_fault_state = True; 4404+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4405 return NT_STATUS_NOT_IMPLEMENTED; 4406 } 4407 4408@@ -3310,7 +3310,7 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc 4409 * _lsa_EnumTrustedDomains() afterwards - gd */ 4410 4411 if (!(pdb_capabilities() & PDB_CAP_TRUSTED_DOMAINS_EX)) { 4412- p->rng_fault_state = True; 4413+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4414 return NT_STATUS_NOT_IMPLEMENTED; 4415 } 4416 4417@@ -3379,107 +3379,107 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc 4418 NTSTATUS _lsa_QueryDomainInformationPolicy(struct pipes_struct *p, 4419 struct lsa_QueryDomainInformationPolicy *r) 4420 { 4421- p->rng_fault_state = True; 4422+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4423 return NT_STATUS_NOT_IMPLEMENTED; 4424 } 4425 4426 NTSTATUS _lsa_SetDomainInformationPolicy(struct pipes_struct *p, 4427 struct lsa_SetDomainInformationPolicy *r) 4428 { 4429- p->rng_fault_state = True; 4430+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4431 return NT_STATUS_NOT_IMPLEMENTED; 4432 } 4433 4434 NTSTATUS _lsa_TestCall(struct pipes_struct *p, struct lsa_TestCall *r) 4435 { 4436- p->rng_fault_state = True; 4437+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4438 return NT_STATUS_NOT_IMPLEMENTED; 4439 } 4440 4441 NTSTATUS _lsa_CREDRWRITE(struct pipes_struct *p, struct lsa_CREDRWRITE *r) 4442 { 4443- p->rng_fault_state = True; 4444+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4445 return NT_STATUS_NOT_IMPLEMENTED; 4446 } 4447 4448 NTSTATUS _lsa_CREDRREAD(struct pipes_struct *p, struct lsa_CREDRREAD *r) 4449 { 4450- p->rng_fault_state = True; 4451+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4452 return NT_STATUS_NOT_IMPLEMENTED; 4453 } 4454 4455 NTSTATUS _lsa_CREDRENUMERATE(struct pipes_struct *p, struct lsa_CREDRENUMERATE *r) 4456 { 4457- p->rng_fault_state = True; 4458+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4459 return NT_STATUS_NOT_IMPLEMENTED; 4460 } 4461 4462 NTSTATUS _lsa_CREDRWRITEDOMAINCREDENTIALS(struct pipes_struct *p, 4463 struct lsa_CREDRWRITEDOMAINCREDENTIALS *r) 4464 { 4465- p->rng_fault_state = True; 4466+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4467 return NT_STATUS_NOT_IMPLEMENTED; 4468 } 4469 4470 NTSTATUS _lsa_CREDRREADDOMAINCREDENTIALS(struct pipes_struct *p, 4471 struct lsa_CREDRREADDOMAINCREDENTIALS *r) 4472 { 4473- p->rng_fault_state = True; 4474+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4475 return NT_STATUS_NOT_IMPLEMENTED; 4476 } 4477 4478 NTSTATUS _lsa_CREDRDELETE(struct pipes_struct *p, struct lsa_CREDRDELETE *r) 4479 { 4480- p->rng_fault_state = True; 4481+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4482 return NT_STATUS_NOT_IMPLEMENTED; 4483 } 4484 4485 NTSTATUS _lsa_CREDRGETTARGETINFO(struct pipes_struct *p, 4486 struct lsa_CREDRGETTARGETINFO *r) 4487 { 4488- p->rng_fault_state = True; 4489+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4490 return NT_STATUS_NOT_IMPLEMENTED; 4491 } 4492 4493 NTSTATUS _lsa_CREDRPROFILELOADED(struct pipes_struct *p, 4494 struct lsa_CREDRPROFILELOADED *r) 4495 { 4496- p->rng_fault_state = True; 4497+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4498 return NT_STATUS_NOT_IMPLEMENTED; 4499 } 4500 4501 NTSTATUS _lsa_CREDRGETSESSIONTYPES(struct pipes_struct *p, 4502 struct lsa_CREDRGETSESSIONTYPES *r) 4503 { 4504- p->rng_fault_state = True; 4505+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4506 return NT_STATUS_NOT_IMPLEMENTED; 4507 } 4508 4509 NTSTATUS _lsa_LSARREGISTERAUDITEVENT(struct pipes_struct *p, 4510 struct lsa_LSARREGISTERAUDITEVENT *r) 4511 { 4512- p->rng_fault_state = True; 4513+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4514 return NT_STATUS_NOT_IMPLEMENTED; 4515 } 4516 4517 NTSTATUS _lsa_LSARGENAUDITEVENT(struct pipes_struct *p, 4518 struct lsa_LSARGENAUDITEVENT *r) 4519 { 4520- p->rng_fault_state = True; 4521+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4522 return NT_STATUS_NOT_IMPLEMENTED; 4523 } 4524 4525 NTSTATUS _lsa_LSARUNREGISTERAUDITEVENT(struct pipes_struct *p, 4526 struct lsa_LSARUNREGISTERAUDITEVENT *r) 4527 { 4528- p->rng_fault_state = True; 4529+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4530 return NT_STATUS_NOT_IMPLEMENTED; 4531 } 4532 4533 NTSTATUS _lsa_lsaRQueryForestTrustInformation(struct pipes_struct *p, 4534 struct lsa_lsaRQueryForestTrustInformation *r) 4535 { 4536- p->rng_fault_state = True; 4537+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4538 return NT_STATUS_NOT_IMPLEMENTED; 4539 } 4540 4541@@ -3992,34 +3992,34 @@ NTSTATUS _lsa_lsaRSetForestTrustInformat 4542 NTSTATUS _lsa_CREDRRENAME(struct pipes_struct *p, 4543 struct lsa_CREDRRENAME *r) 4544 { 4545- p->rng_fault_state = True; 4546+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4547 return NT_STATUS_NOT_IMPLEMENTED; 4548 } 4549 4550 NTSTATUS _lsa_LSAROPENPOLICYSCE(struct pipes_struct *p, 4551 struct lsa_LSAROPENPOLICYSCE *r) 4552 { 4553- p->rng_fault_state = True; 4554+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4555 return NT_STATUS_NOT_IMPLEMENTED; 4556 } 4557 4558 NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p, 4559 struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE *r) 4560 { 4561- p->rng_fault_state = True; 4562+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4563 return NT_STATUS_NOT_IMPLEMENTED; 4564 } 4565 4566 NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p, 4567 struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE *r) 4568 { 4569- p->rng_fault_state = True; 4570+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4571 return NT_STATUS_NOT_IMPLEMENTED; 4572 } 4573 4574 NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(struct pipes_struct *p, 4575 struct lsa_LSARADTREPORTSECURITYEVENT *r) 4576 { 4577- p->rng_fault_state = True; 4578+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4579 return NT_STATUS_NOT_IMPLEMENTED; 4580 } 4581--- a/source3/rpc_server/netlogon/srv_netlog_nt.c 4582+++ b/source3/rpc_server/netlogon/srv_netlog_nt.c 4583@@ -1787,7 +1787,7 @@ NTSTATUS _netr_LogonSamLogonEx(struct pi 4584 WERROR _netr_LogonUasLogon(struct pipes_struct *p, 4585 struct netr_LogonUasLogon *r) 4586 { 4587- p->rng_fault_state = true; 4588+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4589 return WERR_NOT_SUPPORTED; 4590 } 4591 4592@@ -1797,7 +1797,7 @@ WERROR _netr_LogonUasLogon(struct pipes_ 4593 WERROR _netr_LogonUasLogoff(struct pipes_struct *p, 4594 struct netr_LogonUasLogoff *r) 4595 { 4596- p->rng_fault_state = true; 4597+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4598 return WERR_NOT_SUPPORTED; 4599 } 4600 4601@@ -1807,7 +1807,7 @@ WERROR _netr_LogonUasLogoff(struct pipes 4602 NTSTATUS _netr_DatabaseDeltas(struct pipes_struct *p, 4603 struct netr_DatabaseDeltas *r) 4604 { 4605- p->rng_fault_state = true; 4606+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4607 return NT_STATUS_NOT_IMPLEMENTED; 4608 } 4609 4610@@ -1817,7 +1817,7 @@ NTSTATUS _netr_DatabaseDeltas(struct pip 4611 NTSTATUS _netr_DatabaseSync(struct pipes_struct *p, 4612 struct netr_DatabaseSync *r) 4613 { 4614- p->rng_fault_state = true; 4615+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4616 return NT_STATUS_NOT_IMPLEMENTED; 4617 } 4618 4619@@ -1827,7 +1827,7 @@ NTSTATUS _netr_DatabaseSync(struct pipes 4620 NTSTATUS _netr_AccountDeltas(struct pipes_struct *p, 4621 struct netr_AccountDeltas *r) 4622 { 4623- p->rng_fault_state = true; 4624+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4625 return NT_STATUS_NOT_IMPLEMENTED; 4626 } 4627 4628@@ -1837,7 +1837,7 @@ NTSTATUS _netr_AccountDeltas(struct pipe 4629 NTSTATUS _netr_AccountSync(struct pipes_struct *p, 4630 struct netr_AccountSync *r) 4631 { 4632- p->rng_fault_state = true; 4633+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4634 return NT_STATUS_NOT_IMPLEMENTED; 4635 } 4636 4637@@ -1978,7 +1978,7 @@ WERROR _netr_GetAnyDCName(struct pipes_s 4638 NTSTATUS _netr_DatabaseSync2(struct pipes_struct *p, 4639 struct netr_DatabaseSync2 *r) 4640 { 4641- p->rng_fault_state = true; 4642+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4643 return NT_STATUS_NOT_IMPLEMENTED; 4644 } 4645 4646@@ -1988,7 +1988,7 @@ NTSTATUS _netr_DatabaseSync2(struct pipe 4647 NTSTATUS _netr_DatabaseRedo(struct pipes_struct *p, 4648 struct netr_DatabaseRedo *r) 4649 { 4650- p->rng_fault_state = true; 4651+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4652 return NT_STATUS_NOT_IMPLEMENTED; 4653 } 4654 4655@@ -1998,7 +1998,7 @@ NTSTATUS _netr_DatabaseRedo(struct pipes 4656 WERROR _netr_DsRGetDCName(struct pipes_struct *p, 4657 struct netr_DsRGetDCName *r) 4658 { 4659- p->rng_fault_state = true; 4660+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4661 return WERR_NOT_SUPPORTED; 4662 } 4663 4664@@ -2017,7 +2017,7 @@ NTSTATUS _netr_LogonGetCapabilities(stru 4665 WERROR _netr_NETRLOGONSETSERVICEBITS(struct pipes_struct *p, 4666 struct netr_NETRLOGONSETSERVICEBITS *r) 4667 { 4668- p->rng_fault_state = true; 4669+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4670 return WERR_NOT_SUPPORTED; 4671 } 4672 4673@@ -2027,7 +2027,7 @@ WERROR _netr_NETRLOGONSETSERVICEBITS(str 4674 WERROR _netr_LogonGetTrustRid(struct pipes_struct *p, 4675 struct netr_LogonGetTrustRid *r) 4676 { 4677- p->rng_fault_state = true; 4678+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4679 return WERR_NOT_SUPPORTED; 4680 } 4681 4682@@ -2037,7 +2037,7 @@ WERROR _netr_LogonGetTrustRid(struct pip 4683 WERROR _netr_NETRLOGONCOMPUTESERVERDIGEST(struct pipes_struct *p, 4684 struct netr_NETRLOGONCOMPUTESERVERDIGEST *r) 4685 { 4686- p->rng_fault_state = true; 4687+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4688 return WERR_NOT_SUPPORTED; 4689 } 4690 4691@@ -2047,7 +2047,7 @@ WERROR _netr_NETRLOGONCOMPUTESERVERDIGES 4692 WERROR _netr_NETRLOGONCOMPUTECLIENTDIGEST(struct pipes_struct *p, 4693 struct netr_NETRLOGONCOMPUTECLIENTDIGEST *r) 4694 { 4695- p->rng_fault_state = true; 4696+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4697 return WERR_NOT_SUPPORTED; 4698 } 4699 4700@@ -2057,7 +2057,7 @@ WERROR _netr_NETRLOGONCOMPUTECLIENTDIGES 4701 WERROR _netr_DsRGetDCNameEx(struct pipes_struct *p, 4702 struct netr_DsRGetDCNameEx *r) 4703 { 4704- p->rng_fault_state = true; 4705+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4706 return WERR_NOT_SUPPORTED; 4707 } 4708 4709@@ -2067,7 +2067,7 @@ WERROR _netr_DsRGetDCNameEx(struct pipes 4710 WERROR _netr_DsRGetSiteName(struct pipes_struct *p, 4711 struct netr_DsRGetSiteName *r) 4712 { 4713- p->rng_fault_state = true; 4714+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4715 return WERR_NOT_SUPPORTED; 4716 } 4717 4718@@ -2077,7 +2077,7 @@ WERROR _netr_DsRGetSiteName(struct pipes 4719 NTSTATUS _netr_LogonGetDomainInfo(struct pipes_struct *p, 4720 struct netr_LogonGetDomainInfo *r) 4721 { 4722- p->rng_fault_state = true; 4723+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4724 return NT_STATUS_NOT_IMPLEMENTED; 4725 } 4726 4727@@ -2087,7 +2087,7 @@ NTSTATUS _netr_LogonGetDomainInfo(struct 4728 WERROR _netr_ServerPasswordGet(struct pipes_struct *p, 4729 struct netr_ServerPasswordGet *r) 4730 { 4731- p->rng_fault_state = true; 4732+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4733 return WERR_NOT_SUPPORTED; 4734 } 4735 4736@@ -2097,7 +2097,7 @@ WERROR _netr_ServerPasswordGet(struct pi 4737 WERROR _netr_NETRLOGONSENDTOSAM(struct pipes_struct *p, 4738 struct netr_NETRLOGONSENDTOSAM *r) 4739 { 4740- p->rng_fault_state = true; 4741+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4742 return WERR_NOT_SUPPORTED; 4743 } 4744 4745@@ -2107,7 +2107,7 @@ WERROR _netr_NETRLOGONSENDTOSAM(struct p 4746 WERROR _netr_DsRAddressToSitenamesW(struct pipes_struct *p, 4747 struct netr_DsRAddressToSitenamesW *r) 4748 { 4749- p->rng_fault_state = true; 4750+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4751 return WERR_NOT_SUPPORTED; 4752 } 4753 4754@@ -2117,7 +2117,7 @@ WERROR _netr_DsRAddressToSitenamesW(stru 4755 WERROR _netr_DsRGetDCNameEx2(struct pipes_struct *p, 4756 struct netr_DsRGetDCNameEx2 *r) 4757 { 4758- p->rng_fault_state = true; 4759+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4760 return WERR_NOT_SUPPORTED; 4761 } 4762 4763@@ -2127,7 +2127,7 @@ WERROR _netr_DsRGetDCNameEx2(struct pipe 4764 WERROR _netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN(struct pipes_struct *p, 4765 struct netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN *r) 4766 { 4767- p->rng_fault_state = true; 4768+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4769 return WERR_NOT_SUPPORTED; 4770 } 4771 4772@@ -2137,7 +2137,7 @@ WERROR _netr_NETRLOGONGETTIMESERVICEPARE 4773 WERROR _netr_NetrEnumerateTrustedDomainsEx(struct pipes_struct *p, 4774 struct netr_NetrEnumerateTrustedDomainsEx *r) 4775 { 4776- p->rng_fault_state = true; 4777+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4778 return WERR_NOT_SUPPORTED; 4779 } 4780 4781@@ -2147,7 +2147,7 @@ WERROR _netr_NetrEnumerateTrustedDomains 4782 WERROR _netr_DsRAddressToSitenamesExW(struct pipes_struct *p, 4783 struct netr_DsRAddressToSitenamesExW *r) 4784 { 4785- p->rng_fault_state = true; 4786+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4787 return WERR_NOT_SUPPORTED; 4788 } 4789 4790@@ -2157,7 +2157,7 @@ WERROR _netr_DsRAddressToSitenamesExW(st 4791 WERROR _netr_DsrGetDcSiteCoverageW(struct pipes_struct *p, 4792 struct netr_DsrGetDcSiteCoverageW *r) 4793 { 4794- p->rng_fault_state = true; 4795+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4796 return WERR_NOT_SUPPORTED; 4797 } 4798 4799@@ -2167,7 +2167,7 @@ WERROR _netr_DsrGetDcSiteCoverageW(struc 4800 WERROR _netr_DsrEnumerateDomainTrusts(struct pipes_struct *p, 4801 struct netr_DsrEnumerateDomainTrusts *r) 4802 { 4803- p->rng_fault_state = true; 4804+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4805 return WERR_NOT_SUPPORTED; 4806 } 4807 4808@@ -2177,7 +2177,7 @@ WERROR _netr_DsrEnumerateDomainTrusts(st 4809 WERROR _netr_DsrDeregisterDNSHostRecords(struct pipes_struct *p, 4810 struct netr_DsrDeregisterDNSHostRecords *r) 4811 { 4812- p->rng_fault_state = true; 4813+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4814 return WERR_NOT_SUPPORTED; 4815 } 4816 4817@@ -2187,7 +2187,7 @@ WERROR _netr_DsrDeregisterDNSHostRecords 4818 NTSTATUS _netr_ServerTrustPasswordsGet(struct pipes_struct *p, 4819 struct netr_ServerTrustPasswordsGet *r) 4820 { 4821- p->rng_fault_state = true; 4822+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4823 return NT_STATUS_NOT_IMPLEMENTED; 4824 } 4825 4826@@ -2197,7 +2197,7 @@ NTSTATUS _netr_ServerTrustPasswordsGet(s 4827 WERROR _netr_DsRGetForestTrustInformation(struct pipes_struct *p, 4828 struct netr_DsRGetForestTrustInformation *r) 4829 { 4830- p->rng_fault_state = true; 4831+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4832 return WERR_NOT_SUPPORTED; 4833 } 4834 4835@@ -2476,7 +2476,7 @@ NTSTATUS _netr_ServerGetTrustInfo(struct 4836 NTSTATUS _netr_Unused47(struct pipes_struct *p, 4837 struct netr_Unused47 *r) 4838 { 4839- p->rng_fault_state = true; 4840+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4841 return NT_STATUS_NOT_IMPLEMENTED; 4842 } 4843 4844@@ -2486,6 +2486,6 @@ NTSTATUS _netr_Unused47(struct pipes_str 4845 NTSTATUS _netr_DsrUpdateReadOnlyServerDnsRecords(struct pipes_struct *p, 4846 struct netr_DsrUpdateReadOnlyServerDnsRecords *r) 4847 { 4848- p->rng_fault_state = true; 4849+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4850 return NT_STATUS_NOT_IMPLEMENTED; 4851 } 4852--- a/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c 4853+++ b/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c 4854@@ -227,7 +227,7 @@ WERROR _PNP_HwProfFlags(struct pipes_str 4855 WERROR _PNP_Disconnect(struct pipes_struct *p, 4856 struct PNP_Disconnect *r) 4857 { 4858- p->rng_fault_state = true; 4859+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4860 return WERR_NOT_SUPPORTED; 4861 } 4862 4863@@ -237,7 +237,7 @@ WERROR _PNP_Disconnect(struct pipes_stru 4864 WERROR _PNP_Connect(struct pipes_struct *p, 4865 struct PNP_Connect *r) 4866 { 4867- p->rng_fault_state = true; 4868+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4869 return WERR_NOT_SUPPORTED; 4870 } 4871 4872@@ -247,7 +247,7 @@ WERROR _PNP_Connect(struct pipes_struct 4873 WERROR _PNP_GetGlobalState(struct pipes_struct *p, 4874 struct PNP_GetGlobalState *r) 4875 { 4876- p->rng_fault_state = true; 4877+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4878 return WERR_NOT_SUPPORTED; 4879 } 4880 4881@@ -257,7 +257,7 @@ WERROR _PNP_GetGlobalState(struct pipes_ 4882 WERROR _PNP_InitDetection(struct pipes_struct *p, 4883 struct PNP_InitDetection *r) 4884 { 4885- p->rng_fault_state = true; 4886+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4887 return WERR_NOT_SUPPORTED; 4888 } 4889 4890@@ -267,7 +267,7 @@ WERROR _PNP_InitDetection(struct pipes_s 4891 WERROR _PNP_ReportLogOn(struct pipes_struct *p, 4892 struct PNP_ReportLogOn *r) 4893 { 4894- p->rng_fault_state = true; 4895+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4896 return WERR_NOT_SUPPORTED; 4897 } 4898 4899@@ -277,7 +277,7 @@ WERROR _PNP_ReportLogOn(struct pipes_str 4900 WERROR _PNP_GetRootDeviceInstance(struct pipes_struct *p, 4901 struct PNP_GetRootDeviceInstance *r) 4902 { 4903- p->rng_fault_state = true; 4904+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4905 return WERR_NOT_SUPPORTED; 4906 } 4907 4908@@ -287,7 +287,7 @@ WERROR _PNP_GetRootDeviceInstance(struct 4909 WERROR _PNP_GetRelatedDeviceInstance(struct pipes_struct *p, 4910 struct PNP_GetRelatedDeviceInstance *r) 4911 { 4912- p->rng_fault_state = true; 4913+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4914 return WERR_NOT_SUPPORTED; 4915 } 4916 4917@@ -297,7 +297,7 @@ WERROR _PNP_GetRelatedDeviceInstance(str 4918 WERROR _PNP_EnumerateSubKeys(struct pipes_struct *p, 4919 struct PNP_EnumerateSubKeys *r) 4920 { 4921- p->rng_fault_state = true; 4922+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4923 return WERR_NOT_SUPPORTED; 4924 } 4925 4926@@ -307,7 +307,7 @@ WERROR _PNP_EnumerateSubKeys(struct pipe 4927 WERROR _PNP_GetDepth(struct pipes_struct *p, 4928 struct PNP_GetDepth *r) 4929 { 4930- p->rng_fault_state = true; 4931+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4932 return WERR_NOT_SUPPORTED; 4933 } 4934 4935@@ -317,7 +317,7 @@ WERROR _PNP_GetDepth(struct pipes_struct 4936 WERROR _PNP_SetDeviceRegProp(struct pipes_struct *p, 4937 struct PNP_SetDeviceRegProp *r) 4938 { 4939- p->rng_fault_state = true; 4940+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4941 return WERR_NOT_SUPPORTED; 4942 } 4943 4944@@ -327,7 +327,7 @@ WERROR _PNP_SetDeviceRegProp(struct pipe 4945 WERROR _PNP_GetClassInstance(struct pipes_struct *p, 4946 struct PNP_GetClassInstance *r) 4947 { 4948- p->rng_fault_state = true; 4949+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4950 return WERR_NOT_SUPPORTED; 4951 } 4952 4953@@ -337,7 +337,7 @@ WERROR _PNP_GetClassInstance(struct pipe 4954 WERROR _PNP_CreateKey(struct pipes_struct *p, 4955 struct PNP_CreateKey *r) 4956 { 4957- p->rng_fault_state = true; 4958+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4959 return WERR_NOT_SUPPORTED; 4960 } 4961 4962@@ -347,7 +347,7 @@ WERROR _PNP_CreateKey(struct pipes_struc 4963 WERROR _PNP_DeleteRegistryKey(struct pipes_struct *p, 4964 struct PNP_DeleteRegistryKey *r) 4965 { 4966- p->rng_fault_state = true; 4967+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4968 return WERR_NOT_SUPPORTED; 4969 } 4970 4971@@ -357,7 +357,7 @@ WERROR _PNP_DeleteRegistryKey(struct pip 4972 WERROR _PNP_GetClassCount(struct pipes_struct *p, 4973 struct PNP_GetClassCount *r) 4974 { 4975- p->rng_fault_state = true; 4976+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4977 return WERR_NOT_SUPPORTED; 4978 } 4979 4980@@ -367,7 +367,7 @@ WERROR _PNP_GetClassCount(struct pipes_s 4981 WERROR _PNP_GetClassName(struct pipes_struct *p, 4982 struct PNP_GetClassName *r) 4983 { 4984- p->rng_fault_state = true; 4985+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4986 return WERR_NOT_SUPPORTED; 4987 } 4988 4989@@ -377,7 +377,7 @@ WERROR _PNP_GetClassName(struct pipes_st 4990 WERROR _PNP_DeleteClassKey(struct pipes_struct *p, 4991 struct PNP_DeleteClassKey *r) 4992 { 4993- p->rng_fault_state = true; 4994+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 4995 return WERR_NOT_SUPPORTED; 4996 } 4997 4998@@ -387,7 +387,7 @@ WERROR _PNP_DeleteClassKey(struct pipes_ 4999 WERROR _PNP_GetInterfaceDeviceAlias(struct pipes_struct *p, 5000 struct PNP_GetInterfaceDeviceAlias *r) 5001 { 5002- p->rng_fault_state = true; 5003+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5004 return WERR_NOT_SUPPORTED; 5005 } 5006 5007@@ -397,7 +397,7 @@ WERROR _PNP_GetInterfaceDeviceAlias(stru 5008 WERROR _PNP_GetInterfaceDeviceList(struct pipes_struct *p, 5009 struct PNP_GetInterfaceDeviceList *r) 5010 { 5011- p->rng_fault_state = true; 5012+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5013 return WERR_NOT_SUPPORTED; 5014 } 5015 5016@@ -407,7 +407,7 @@ WERROR _PNP_GetInterfaceDeviceList(struc 5017 WERROR _PNP_GetInterfaceDeviceListSize(struct pipes_struct *p, 5018 struct PNP_GetInterfaceDeviceListSize *r) 5019 { 5020- p->rng_fault_state = true; 5021+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5022 return WERR_NOT_SUPPORTED; 5023 } 5024 5025@@ -417,7 +417,7 @@ WERROR _PNP_GetInterfaceDeviceListSize(s 5026 WERROR _PNP_RegisterDeviceClassAssociation(struct pipes_struct *p, 5027 struct PNP_RegisterDeviceClassAssociation *r) 5028 { 5029- p->rng_fault_state = true; 5030+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5031 return WERR_NOT_SUPPORTED; 5032 } 5033 5034@@ -427,7 +427,7 @@ WERROR _PNP_RegisterDeviceClassAssociati 5035 WERROR _PNP_UnregisterDeviceClassAssociation(struct pipes_struct *p, 5036 struct PNP_UnregisterDeviceClassAssociation *r) 5037 { 5038- p->rng_fault_state = true; 5039+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5040 return WERR_NOT_SUPPORTED; 5041 } 5042 5043@@ -437,7 +437,7 @@ WERROR _PNP_UnregisterDeviceClassAssocia 5044 WERROR _PNP_GetClassRegProp(struct pipes_struct *p, 5045 struct PNP_GetClassRegProp *r) 5046 { 5047- p->rng_fault_state = true; 5048+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5049 return WERR_NOT_SUPPORTED; 5050 } 5051 5052@@ -447,7 +447,7 @@ WERROR _PNP_GetClassRegProp(struct pipes 5053 WERROR _PNP_SetClassRegProp(struct pipes_struct *p, 5054 struct PNP_SetClassRegProp *r) 5055 { 5056- p->rng_fault_state = true; 5057+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5058 return WERR_NOT_SUPPORTED; 5059 } 5060 5061@@ -457,7 +457,7 @@ WERROR _PNP_SetClassRegProp(struct pipes 5062 WERROR _PNP_CreateDevInst(struct pipes_struct *p, 5063 struct PNP_CreateDevInst *r) 5064 { 5065- p->rng_fault_state = true; 5066+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5067 return WERR_NOT_SUPPORTED; 5068 } 5069 5070@@ -467,7 +467,7 @@ WERROR _PNP_CreateDevInst(struct pipes_s 5071 WERROR _PNP_DeviceInstanceAction(struct pipes_struct *p, 5072 struct PNP_DeviceInstanceAction *r) 5073 { 5074- p->rng_fault_state = true; 5075+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5076 return WERR_NOT_SUPPORTED; 5077 } 5078 5079@@ -477,7 +477,7 @@ WERROR _PNP_DeviceInstanceAction(struct 5080 WERROR _PNP_GetDeviceStatus(struct pipes_struct *p, 5081 struct PNP_GetDeviceStatus *r) 5082 { 5083- p->rng_fault_state = true; 5084+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5085 return WERR_NOT_SUPPORTED; 5086 } 5087 5088@@ -487,7 +487,7 @@ WERROR _PNP_GetDeviceStatus(struct pipes 5089 WERROR _PNP_SetDeviceProblem(struct pipes_struct *p, 5090 struct PNP_SetDeviceProblem *r) 5091 { 5092- p->rng_fault_state = true; 5093+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5094 return WERR_NOT_SUPPORTED; 5095 } 5096 5097@@ -497,7 +497,7 @@ WERROR _PNP_SetDeviceProblem(struct pipe 5098 WERROR _PNP_DisableDevInst(struct pipes_struct *p, 5099 struct PNP_DisableDevInst *r) 5100 { 5101- p->rng_fault_state = true; 5102+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5103 return WERR_NOT_SUPPORTED; 5104 } 5105 5106@@ -507,7 +507,7 @@ WERROR _PNP_DisableDevInst(struct pipes_ 5107 WERROR _PNP_UninstallDevInst(struct pipes_struct *p, 5108 struct PNP_UninstallDevInst *r) 5109 { 5110- p->rng_fault_state = true; 5111+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5112 return WERR_NOT_SUPPORTED; 5113 } 5114 5115@@ -517,7 +517,7 @@ WERROR _PNP_UninstallDevInst(struct pipe 5116 WERROR _PNP_AddID(struct pipes_struct *p, 5117 struct PNP_AddID *r) 5118 { 5119- p->rng_fault_state = true; 5120+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5121 return WERR_NOT_SUPPORTED; 5122 } 5123 5124@@ -527,7 +527,7 @@ WERROR _PNP_AddID(struct pipes_struct *p 5125 WERROR _PNP_RegisterDriver(struct pipes_struct *p, 5126 struct PNP_RegisterDriver *r) 5127 { 5128- p->rng_fault_state = true; 5129+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5130 return WERR_NOT_SUPPORTED; 5131 } 5132 5133@@ -537,7 +537,7 @@ WERROR _PNP_RegisterDriver(struct pipes_ 5134 WERROR _PNP_QueryRemove(struct pipes_struct *p, 5135 struct PNP_QueryRemove *r) 5136 { 5137- p->rng_fault_state = true; 5138+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5139 return WERR_NOT_SUPPORTED; 5140 } 5141 5142@@ -547,7 +547,7 @@ WERROR _PNP_QueryRemove(struct pipes_str 5143 WERROR _PNP_RequestDeviceEject(struct pipes_struct *p, 5144 struct PNP_RequestDeviceEject *r) 5145 { 5146- p->rng_fault_state = true; 5147+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5148 return WERR_NOT_SUPPORTED; 5149 } 5150 5151@@ -557,7 +557,7 @@ WERROR _PNP_RequestDeviceEject(struct pi 5152 WERROR _PNP_IsDockStationPresent(struct pipes_struct *p, 5153 struct PNP_IsDockStationPresent *r) 5154 { 5155- p->rng_fault_state = true; 5156+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5157 return WERR_NOT_SUPPORTED; 5158 } 5159 5160@@ -567,7 +567,7 @@ WERROR _PNP_IsDockStationPresent(struct 5161 WERROR _PNP_RequestEjectPC(struct pipes_struct *p, 5162 struct PNP_RequestEjectPC *r) 5163 { 5164- p->rng_fault_state = true; 5165+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5166 return WERR_NOT_SUPPORTED; 5167 } 5168 5169@@ -577,7 +577,7 @@ WERROR _PNP_RequestEjectPC(struct pipes_ 5170 WERROR _PNP_AddEmptyLogConf(struct pipes_struct *p, 5171 struct PNP_AddEmptyLogConf *r) 5172 { 5173- p->rng_fault_state = true; 5174+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5175 return WERR_NOT_SUPPORTED; 5176 } 5177 5178@@ -587,7 +587,7 @@ WERROR _PNP_AddEmptyLogConf(struct pipes 5179 WERROR _PNP_FreeLogConf(struct pipes_struct *p, 5180 struct PNP_FreeLogConf *r) 5181 { 5182- p->rng_fault_state = true; 5183+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5184 return WERR_NOT_SUPPORTED; 5185 } 5186 5187@@ -597,7 +597,7 @@ WERROR _PNP_FreeLogConf(struct pipes_str 5188 WERROR _PNP_GetFirstLogConf(struct pipes_struct *p, 5189 struct PNP_GetFirstLogConf *r) 5190 { 5191- p->rng_fault_state = true; 5192+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5193 return WERR_NOT_SUPPORTED; 5194 } 5195 5196@@ -607,7 +607,7 @@ WERROR _PNP_GetFirstLogConf(struct pipes 5197 WERROR _PNP_GetNextLogConf(struct pipes_struct *p, 5198 struct PNP_GetNextLogConf *r) 5199 { 5200- p->rng_fault_state = true; 5201+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5202 return WERR_NOT_SUPPORTED; 5203 } 5204 5205@@ -617,7 +617,7 @@ WERROR _PNP_GetNextLogConf(struct pipes_ 5206 WERROR _PNP_GetLogConfPriority(struct pipes_struct *p, 5207 struct PNP_GetLogConfPriority *r) 5208 { 5209- p->rng_fault_state = true; 5210+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5211 return WERR_NOT_SUPPORTED; 5212 } 5213 5214@@ -627,7 +627,7 @@ WERROR _PNP_GetLogConfPriority(struct pi 5215 WERROR _PNP_AddResDes(struct pipes_struct *p, 5216 struct PNP_AddResDes *r) 5217 { 5218- p->rng_fault_state = true; 5219+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5220 return WERR_NOT_SUPPORTED; 5221 } 5222 5223@@ -637,7 +637,7 @@ WERROR _PNP_AddResDes(struct pipes_struc 5224 WERROR _PNP_FreeResDes(struct pipes_struct *p, 5225 struct PNP_FreeResDes *r) 5226 { 5227- p->rng_fault_state = true; 5228+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5229 return WERR_NOT_SUPPORTED; 5230 } 5231 5232@@ -647,7 +647,7 @@ WERROR _PNP_FreeResDes(struct pipes_stru 5233 WERROR _PNP_GetNextResDes(struct pipes_struct *p, 5234 struct PNP_GetNextResDes *r) 5235 { 5236- p->rng_fault_state = true; 5237+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5238 return WERR_NOT_SUPPORTED; 5239 } 5240 5241@@ -657,7 +657,7 @@ WERROR _PNP_GetNextResDes(struct pipes_s 5242 WERROR _PNP_GetResDesData(struct pipes_struct *p, 5243 struct PNP_GetResDesData *r) 5244 { 5245- p->rng_fault_state = true; 5246+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5247 return WERR_NOT_SUPPORTED; 5248 } 5249 5250@@ -667,7 +667,7 @@ WERROR _PNP_GetResDesData(struct pipes_s 5251 WERROR _PNP_GetResDesDataSize(struct pipes_struct *p, 5252 struct PNP_GetResDesDataSize *r) 5253 { 5254- p->rng_fault_state = true; 5255+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5256 return WERR_NOT_SUPPORTED; 5257 } 5258 5259@@ -677,7 +677,7 @@ WERROR _PNP_GetResDesDataSize(struct pip 5260 WERROR _PNP_ModifyResDes(struct pipes_struct *p, 5261 struct PNP_ModifyResDes *r) 5262 { 5263- p->rng_fault_state = true; 5264+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5265 return WERR_NOT_SUPPORTED; 5266 } 5267 5268@@ -687,7 +687,7 @@ WERROR _PNP_ModifyResDes(struct pipes_st 5269 WERROR _PNP_DetectResourceLimit(struct pipes_struct *p, 5270 struct PNP_DetectResourceLimit *r) 5271 { 5272- p->rng_fault_state = true; 5273+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5274 return WERR_NOT_SUPPORTED; 5275 } 5276 5277@@ -697,7 +697,7 @@ WERROR _PNP_DetectResourceLimit(struct p 5278 WERROR _PNP_QueryResConfList(struct pipes_struct *p, 5279 struct PNP_QueryResConfList *r) 5280 { 5281- p->rng_fault_state = true; 5282+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5283 return WERR_NOT_SUPPORTED; 5284 } 5285 5286@@ -707,7 +707,7 @@ WERROR _PNP_QueryResConfList(struct pipe 5287 WERROR _PNP_SetHwProf(struct pipes_struct *p, 5288 struct PNP_SetHwProf *r) 5289 { 5290- p->rng_fault_state = true; 5291+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5292 return WERR_NOT_SUPPORTED; 5293 } 5294 5295@@ -717,7 +717,7 @@ WERROR _PNP_SetHwProf(struct pipes_struc 5296 WERROR _PNP_QueryArbitratorFreeData(struct pipes_struct *p, 5297 struct PNP_QueryArbitratorFreeData *r) 5298 { 5299- p->rng_fault_state = true; 5300+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5301 return WERR_NOT_SUPPORTED; 5302 } 5303 5304@@ -727,7 +727,7 @@ WERROR _PNP_QueryArbitratorFreeData(stru 5305 WERROR _PNP_QueryArbitratorFreeSize(struct pipes_struct *p, 5306 struct PNP_QueryArbitratorFreeSize *r) 5307 { 5308- p->rng_fault_state = true; 5309+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5310 return WERR_NOT_SUPPORTED; 5311 } 5312 5313@@ -737,7 +737,7 @@ WERROR _PNP_QueryArbitratorFreeSize(stru 5314 WERROR _PNP_RunDetection(struct pipes_struct *p, 5315 struct PNP_RunDetection *r) 5316 { 5317- p->rng_fault_state = true; 5318+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5319 return WERR_NOT_SUPPORTED; 5320 } 5321 5322@@ -747,7 +747,7 @@ WERROR _PNP_RunDetection(struct pipes_st 5323 WERROR _PNP_RegisterNotification(struct pipes_struct *p, 5324 struct PNP_RegisterNotification *r) 5325 { 5326- p->rng_fault_state = true; 5327+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5328 return WERR_NOT_SUPPORTED; 5329 } 5330 5331@@ -757,7 +757,7 @@ WERROR _PNP_RegisterNotification(struct 5332 WERROR _PNP_UnregisterNotification(struct pipes_struct *p, 5333 struct PNP_UnregisterNotification *r) 5334 { 5335- p->rng_fault_state = true; 5336+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5337 return WERR_NOT_SUPPORTED; 5338 } 5339 5340@@ -767,7 +767,7 @@ WERROR _PNP_UnregisterNotification(struc 5341 WERROR _PNP_GetCustomDevProp(struct pipes_struct *p, 5342 struct PNP_GetCustomDevProp *r) 5343 { 5344- p->rng_fault_state = true; 5345+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5346 return WERR_NOT_SUPPORTED; 5347 } 5348 5349@@ -777,7 +777,7 @@ WERROR _PNP_GetCustomDevProp(struct pipe 5350 WERROR _PNP_GetVersionInternal(struct pipes_struct *p, 5351 struct PNP_GetVersionInternal *r) 5352 { 5353- p->rng_fault_state = true; 5354+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5355 return WERR_NOT_SUPPORTED; 5356 } 5357 5358@@ -787,7 +787,7 @@ WERROR _PNP_GetVersionInternal(struct pi 5359 WERROR _PNP_GetBlockedDriverInfo(struct pipes_struct *p, 5360 struct PNP_GetBlockedDriverInfo *r) 5361 { 5362- p->rng_fault_state = true; 5363+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5364 return WERR_NOT_SUPPORTED; 5365 } 5366 5367@@ -797,6 +797,6 @@ WERROR _PNP_GetBlockedDriverInfo(struct 5368 WERROR _PNP_GetServerSideDeviceInstallFlags(struct pipes_struct *p, 5369 struct PNP_GetServerSideDeviceInstallFlags *r) 5370 { 5371- p->rng_fault_state = true; 5372+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5373 return WERR_NOT_SUPPORTED; 5374 } 5375--- a/source3/rpc_server/rpc_handles.c 5376+++ b/source3/rpc_server/rpc_handles.c 5377@@ -242,7 +242,7 @@ static struct dcesrv_handle *find_policy 5378 DEBUG(4,("Policy not found: ")); 5379 dump_data(4, (uint8_t *)hnd, sizeof(*hnd)); 5380 5381- p->bad_handle_fault_state = true; 5382+ p->fault_state = DCERPC_FAULT_CONTEXT_MISMATCH; 5383 5384 return NULL; 5385 } 5386--- a/source3/rpc_server/rpc_ncacn_np.c 5387+++ b/source3/rpc_server/rpc_ncacn_np.c 5388@@ -216,24 +216,13 @@ static NTSTATUS rpcint_dispatch(struct p 5389 } 5390 5391 if (p->fault_state) { 5392- p->fault_state = false; 5393- data_blob_free(&p->out_data.rdata); 5394- talloc_free_children(p->mem_ctx); 5395- return NT_STATUS_RPC_CALL_FAILED; 5396- } 5397- 5398- if (p->bad_handle_fault_state) { 5399- p->bad_handle_fault_state = false; 5400- data_blob_free(&p->out_data.rdata); 5401- talloc_free_children(p->mem_ctx); 5402- return NT_STATUS_RPC_SS_CONTEXT_MISMATCH; 5403- } 5404+ NTSTATUS status; 5405 5406- if (p->rng_fault_state) { 5407- p->rng_fault_state = false; 5408+ status = NT_STATUS(p->fault_state); 5409+ p->fault_state = 0; 5410 data_blob_free(&p->out_data.rdata); 5411 talloc_free_children(p->mem_ctx); 5412- return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE; 5413+ return status; 5414 } 5415 5416 *out_data = p->out_data.rdata; 5417--- a/source3/rpc_server/samr/srv_samr_nt.c 5418+++ b/source3/rpc_server/samr/srv_samr_nt.c 5419@@ -6682,7 +6682,7 @@ NTSTATUS _samr_ValidatePassword(struct p 5420 NTSTATUS _samr_Shutdown(struct pipes_struct *p, 5421 struct samr_Shutdown *r) 5422 { 5423- p->rng_fault_state = true; 5424+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5425 return NT_STATUS_NOT_IMPLEMENTED; 5426 } 5427 5428@@ -6692,7 +6692,7 @@ NTSTATUS _samr_Shutdown(struct pipes_str 5429 NTSTATUS _samr_SetMemberAttributesOfGroup(struct pipes_struct *p, 5430 struct samr_SetMemberAttributesOfGroup *r) 5431 { 5432- p->rng_fault_state = true; 5433+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5434 return NT_STATUS_NOT_IMPLEMENTED; 5435 } 5436 5437@@ -6702,6 +6702,7 @@ NTSTATUS _samr_SetMemberAttributesOfGrou 5438 NTSTATUS _samr_TestPrivateFunctionsDomain(struct pipes_struct *p, 5439 struct samr_TestPrivateFunctionsDomain *r) 5440 { 5441+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5442 return NT_STATUS_NOT_IMPLEMENTED; 5443 } 5444 5445@@ -6711,6 +6712,7 @@ NTSTATUS _samr_TestPrivateFunctionsDomai 5446 NTSTATUS _samr_TestPrivateFunctionsUser(struct pipes_struct *p, 5447 struct samr_TestPrivateFunctionsUser *r) 5448 { 5449+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5450 return NT_STATUS_NOT_IMPLEMENTED; 5451 } 5452 5453@@ -6720,7 +6722,7 @@ NTSTATUS _samr_TestPrivateFunctionsUser( 5454 NTSTATUS _samr_AddMultipleMembersToAlias(struct pipes_struct *p, 5455 struct samr_AddMultipleMembersToAlias *r) 5456 { 5457- p->rng_fault_state = true; 5458+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5459 return NT_STATUS_NOT_IMPLEMENTED; 5460 } 5461 5462@@ -6730,7 +6732,7 @@ NTSTATUS _samr_AddMultipleMembersToAlias 5463 NTSTATUS _samr_RemoveMultipleMembersFromAlias(struct pipes_struct *p, 5464 struct samr_RemoveMultipleMembersFromAlias *r) 5465 { 5466- p->rng_fault_state = true; 5467+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5468 return NT_STATUS_NOT_IMPLEMENTED; 5469 } 5470 5471@@ -6740,7 +6742,7 @@ NTSTATUS _samr_RemoveMultipleMembersFrom 5472 NTSTATUS _samr_SetBootKeyInformation(struct pipes_struct *p, 5473 struct samr_SetBootKeyInformation *r) 5474 { 5475- p->rng_fault_state = true; 5476+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5477 return NT_STATUS_NOT_IMPLEMENTED; 5478 } 5479 5480@@ -6750,7 +6752,7 @@ NTSTATUS _samr_SetBootKeyInformation(str 5481 NTSTATUS _samr_GetBootKeyInformation(struct pipes_struct *p, 5482 struct samr_GetBootKeyInformation *r) 5483 { 5484- p->rng_fault_state = true; 5485+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5486 return NT_STATUS_NOT_IMPLEMENTED; 5487 } 5488 5489@@ -6760,6 +6762,6 @@ NTSTATUS _samr_GetBootKeyInformation(str 5490 NTSTATUS _samr_SetDsrmPassword(struct pipes_struct *p, 5491 struct samr_SetDsrmPassword *r) 5492 { 5493- p->rng_fault_state = true; 5494+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5495 return NT_STATUS_NOT_IMPLEMENTED; 5496 } 5497--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c 5498+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c 5499@@ -10156,7 +10156,7 @@ WERROR _spoolss_AddPort(struct pipes_str 5500 WERROR _spoolss_GetPrinterDriver(struct pipes_struct *p, 5501 struct spoolss_GetPrinterDriver *r) 5502 { 5503- p->rng_fault_state = true; 5504+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5505 return WERR_NOT_SUPPORTED; 5506 } 5507 5508@@ -10167,7 +10167,7 @@ WERROR _spoolss_GetPrinterDriver(struct 5509 WERROR _spoolss_ReadPrinter(struct pipes_struct *p, 5510 struct spoolss_ReadPrinter *r) 5511 { 5512- p->rng_fault_state = true; 5513+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5514 return WERR_NOT_SUPPORTED; 5515 } 5516 5517@@ -10178,7 +10178,7 @@ WERROR _spoolss_ReadPrinter(struct pipes 5518 WERROR _spoolss_WaitForPrinterChange(struct pipes_struct *p, 5519 struct spoolss_WaitForPrinterChange *r) 5520 { 5521- p->rng_fault_state = true; 5522+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5523 return WERR_NOT_SUPPORTED; 5524 } 5525 5526@@ -10189,7 +10189,7 @@ WERROR _spoolss_WaitForPrinterChange(str 5527 WERROR _spoolss_ConfigurePort(struct pipes_struct *p, 5528 struct spoolss_ConfigurePort *r) 5529 { 5530- p->rng_fault_state = true; 5531+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5532 return WERR_NOT_SUPPORTED; 5533 } 5534 5535@@ -10200,7 +10200,7 @@ WERROR _spoolss_ConfigurePort(struct pip 5536 WERROR _spoolss_DeletePort(struct pipes_struct *p, 5537 struct spoolss_DeletePort *r) 5538 { 5539- p->rng_fault_state = true; 5540+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5541 return WERR_NOT_SUPPORTED; 5542 } 5543 5544@@ -10211,7 +10211,7 @@ WERROR _spoolss_DeletePort(struct pipes_ 5545 WERROR _spoolss_CreatePrinterIC(struct pipes_struct *p, 5546 struct spoolss_CreatePrinterIC *r) 5547 { 5548- p->rng_fault_state = true; 5549+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5550 return WERR_NOT_SUPPORTED; 5551 } 5552 5553@@ -10222,7 +10222,7 @@ WERROR _spoolss_CreatePrinterIC(struct p 5554 WERROR _spoolss_PlayGDIScriptOnPrinterIC(struct pipes_struct *p, 5555 struct spoolss_PlayGDIScriptOnPrinterIC *r) 5556 { 5557- p->rng_fault_state = true; 5558+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5559 return WERR_NOT_SUPPORTED; 5560 } 5561 5562@@ -10233,7 +10233,7 @@ WERROR _spoolss_PlayGDIScriptOnPrinterIC 5563 WERROR _spoolss_DeletePrinterIC(struct pipes_struct *p, 5564 struct spoolss_DeletePrinterIC *r) 5565 { 5566- p->rng_fault_state = true; 5567+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5568 return WERR_NOT_SUPPORTED; 5569 } 5570 5571@@ -10244,7 +10244,7 @@ WERROR _spoolss_DeletePrinterIC(struct p 5572 WERROR _spoolss_AddPrinterConnection(struct pipes_struct *p, 5573 struct spoolss_AddPrinterConnection *r) 5574 { 5575- p->rng_fault_state = true; 5576+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5577 return WERR_NOT_SUPPORTED; 5578 } 5579 5580@@ -10255,7 +10255,7 @@ WERROR _spoolss_AddPrinterConnection(str 5581 WERROR _spoolss_DeletePrinterConnection(struct pipes_struct *p, 5582 struct spoolss_DeletePrinterConnection *r) 5583 { 5584- p->rng_fault_state = true; 5585+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5586 return WERR_NOT_SUPPORTED; 5587 } 5588 5589@@ -10266,7 +10266,7 @@ WERROR _spoolss_DeletePrinterConnection( 5590 WERROR _spoolss_PrinterMessageBox(struct pipes_struct *p, 5591 struct spoolss_PrinterMessageBox *r) 5592 { 5593- p->rng_fault_state = true; 5594+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5595 return WERR_NOT_SUPPORTED; 5596 } 5597 5598@@ -10277,7 +10277,7 @@ WERROR _spoolss_PrinterMessageBox(struct 5599 WERROR _spoolss_AddMonitor(struct pipes_struct *p, 5600 struct spoolss_AddMonitor *r) 5601 { 5602- p->rng_fault_state = true; 5603+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5604 return WERR_NOT_SUPPORTED; 5605 } 5606 5607@@ -10288,7 +10288,7 @@ WERROR _spoolss_AddMonitor(struct pipes_ 5608 WERROR _spoolss_DeleteMonitor(struct pipes_struct *p, 5609 struct spoolss_DeleteMonitor *r) 5610 { 5611- p->rng_fault_state = true; 5612+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5613 return WERR_NOT_SUPPORTED; 5614 } 5615 5616@@ -10299,7 +10299,7 @@ WERROR _spoolss_DeleteMonitor(struct pip 5617 WERROR _spoolss_DeletePrintProcessor(struct pipes_struct *p, 5618 struct spoolss_DeletePrintProcessor *r) 5619 { 5620- p->rng_fault_state = true; 5621+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5622 return WERR_NOT_SUPPORTED; 5623 } 5624 5625@@ -10310,7 +10310,7 @@ WERROR _spoolss_DeletePrintProcessor(str 5626 WERROR _spoolss_AddPrintProvidor(struct pipes_struct *p, 5627 struct spoolss_AddPrintProvidor *r) 5628 { 5629- p->rng_fault_state = true; 5630+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5631 return WERR_NOT_SUPPORTED; 5632 } 5633 5634@@ -10321,7 +10321,7 @@ WERROR _spoolss_AddPrintProvidor(struct 5635 WERROR _spoolss_DeletePrintProvidor(struct pipes_struct *p, 5636 struct spoolss_DeletePrintProvidor *r) 5637 { 5638- p->rng_fault_state = true; 5639+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5640 return WERR_NOT_SUPPORTED; 5641 } 5642 5643@@ -10332,7 +10332,7 @@ WERROR _spoolss_DeletePrintProvidor(stru 5644 WERROR _spoolss_FindFirstPrinterChangeNotification(struct pipes_struct *p, 5645 struct spoolss_FindFirstPrinterChangeNotification *r) 5646 { 5647- p->rng_fault_state = true; 5648+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5649 return WERR_NOT_SUPPORTED; 5650 } 5651 5652@@ -10343,7 +10343,7 @@ WERROR _spoolss_FindFirstPrinterChangeNo 5653 WERROR _spoolss_FindNextPrinterChangeNotification(struct pipes_struct *p, 5654 struct spoolss_FindNextPrinterChangeNotification *r) 5655 { 5656- p->rng_fault_state = true; 5657+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5658 return WERR_NOT_SUPPORTED; 5659 } 5660 5661@@ -10354,7 +10354,7 @@ WERROR _spoolss_FindNextPrinterChangeNot 5662 WERROR _spoolss_RouterFindFirstPrinterChangeNotificationOld(struct pipes_struct *p, 5663 struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r) 5664 { 5665- p->rng_fault_state = true; 5666+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5667 return WERR_NOT_SUPPORTED; 5668 } 5669 5670@@ -10365,7 +10365,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh 5671 WERROR _spoolss_ReplyOpenPrinter(struct pipes_struct *p, 5672 struct spoolss_ReplyOpenPrinter *r) 5673 { 5674- p->rng_fault_state = true; 5675+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5676 return WERR_NOT_SUPPORTED; 5677 } 5678 5679@@ -10376,7 +10376,7 @@ WERROR _spoolss_ReplyOpenPrinter(struct 5680 WERROR _spoolss_RouterReplyPrinter(struct pipes_struct *p, 5681 struct spoolss_RouterReplyPrinter *r) 5682 { 5683- p->rng_fault_state = true; 5684+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5685 return WERR_NOT_SUPPORTED; 5686 } 5687 5688@@ -10387,7 +10387,7 @@ WERROR _spoolss_RouterReplyPrinter(struc 5689 WERROR _spoolss_ReplyClosePrinter(struct pipes_struct *p, 5690 struct spoolss_ReplyClosePrinter *r) 5691 { 5692- p->rng_fault_state = true; 5693+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5694 return WERR_NOT_SUPPORTED; 5695 } 5696 5697@@ -10398,7 +10398,7 @@ WERROR _spoolss_ReplyClosePrinter(struct 5698 WERROR _spoolss_AddPortEx(struct pipes_struct *p, 5699 struct spoolss_AddPortEx *r) 5700 { 5701- p->rng_fault_state = true; 5702+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5703 return WERR_NOT_SUPPORTED; 5704 } 5705 5706@@ -10409,7 +10409,7 @@ WERROR _spoolss_AddPortEx(struct pipes_s 5707 WERROR _spoolss_RouterFindFirstPrinterChangeNotification(struct pipes_struct *p, 5708 struct spoolss_RouterFindFirstPrinterChangeNotification *r) 5709 { 5710- p->rng_fault_state = true; 5711+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5712 return WERR_NOT_SUPPORTED; 5713 } 5714 5715@@ -10420,7 +10420,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh 5716 WERROR _spoolss_SpoolerInit(struct pipes_struct *p, 5717 struct spoolss_SpoolerInit *r) 5718 { 5719- p->rng_fault_state = true; 5720+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5721 return WERR_NOT_SUPPORTED; 5722 } 5723 5724@@ -10431,7 +10431,7 @@ WERROR _spoolss_SpoolerInit(struct pipes 5725 WERROR _spoolss_ResetPrinterEx(struct pipes_struct *p, 5726 struct spoolss_ResetPrinterEx *r) 5727 { 5728- p->rng_fault_state = true; 5729+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5730 return WERR_NOT_SUPPORTED; 5731 } 5732 5733@@ -10442,7 +10442,7 @@ WERROR _spoolss_ResetPrinterEx(struct pi 5734 WERROR _spoolss_RouterReplyPrinterEx(struct pipes_struct *p, 5735 struct spoolss_RouterReplyPrinterEx *r) 5736 { 5737- p->rng_fault_state = true; 5738+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5739 return WERR_NOT_SUPPORTED; 5740 } 5741 5742@@ -10453,7 +10453,7 @@ WERROR _spoolss_RouterReplyPrinterEx(str 5743 WERROR _spoolss_44(struct pipes_struct *p, 5744 struct spoolss_44 *r) 5745 { 5746- p->rng_fault_state = true; 5747+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5748 return WERR_NOT_SUPPORTED; 5749 } 5750 5751@@ -10464,7 +10464,7 @@ WERROR _spoolss_44(struct pipes_struct * 5752 WERROR _spoolss_SetPort(struct pipes_struct *p, 5753 struct spoolss_SetPort *r) 5754 { 5755- p->rng_fault_state = true; 5756+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5757 return WERR_NOT_SUPPORTED; 5758 } 5759 5760@@ -10475,7 +10475,7 @@ WERROR _spoolss_SetPort(struct pipes_str 5761 WERROR _spoolss_4a(struct pipes_struct *p, 5762 struct spoolss_4a *r) 5763 { 5764- p->rng_fault_state = true; 5765+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5766 return WERR_NOT_SUPPORTED; 5767 } 5768 5769@@ -10486,7 +10486,7 @@ WERROR _spoolss_4a(struct pipes_struct * 5770 WERROR _spoolss_4b(struct pipes_struct *p, 5771 struct spoolss_4b *r) 5772 { 5773- p->rng_fault_state = true; 5774+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5775 return WERR_NOT_SUPPORTED; 5776 } 5777 5778@@ -10497,7 +10497,7 @@ WERROR _spoolss_4b(struct pipes_struct * 5779 WERROR _spoolss_4c(struct pipes_struct *p, 5780 struct spoolss_4c *r) 5781 { 5782- p->rng_fault_state = true; 5783+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5784 return WERR_NOT_SUPPORTED; 5785 } 5786 5787@@ -10508,7 +10508,7 @@ WERROR _spoolss_4c(struct pipes_struct * 5788 WERROR _spoolss_53(struct pipes_struct *p, 5789 struct spoolss_53 *r) 5790 { 5791- p->rng_fault_state = true; 5792+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5793 return WERR_NOT_SUPPORTED; 5794 } 5795 5796@@ -10519,7 +10519,7 @@ WERROR _spoolss_53(struct pipes_struct * 5797 WERROR _spoolss_AddPerMachineConnection(struct pipes_struct *p, 5798 struct spoolss_AddPerMachineConnection *r) 5799 { 5800- p->rng_fault_state = true; 5801+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5802 return WERR_NOT_SUPPORTED; 5803 } 5804 5805@@ -10530,7 +10530,7 @@ WERROR _spoolss_AddPerMachineConnection( 5806 WERROR _spoolss_DeletePerMachineConnection(struct pipes_struct *p, 5807 struct spoolss_DeletePerMachineConnection *r) 5808 { 5809- p->rng_fault_state = true; 5810+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5811 return WERR_NOT_SUPPORTED; 5812 } 5813 5814@@ -10541,7 +10541,7 @@ WERROR _spoolss_DeletePerMachineConnecti 5815 WERROR _spoolss_EnumPerMachineConnections(struct pipes_struct *p, 5816 struct spoolss_EnumPerMachineConnections *r) 5817 { 5818- p->rng_fault_state = true; 5819+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5820 return WERR_NOT_SUPPORTED; 5821 } 5822 5823@@ -10552,7 +10552,7 @@ WERROR _spoolss_EnumPerMachineConnection 5824 WERROR _spoolss_5a(struct pipes_struct *p, 5825 struct spoolss_5a *r) 5826 { 5827- p->rng_fault_state = true; 5828+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5829 return WERR_NOT_SUPPORTED; 5830 } 5831 5832@@ -10563,7 +10563,7 @@ WERROR _spoolss_5a(struct pipes_struct * 5833 WERROR _spoolss_5b(struct pipes_struct *p, 5834 struct spoolss_5b *r) 5835 { 5836- p->rng_fault_state = true; 5837+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5838 return WERR_NOT_SUPPORTED; 5839 } 5840 5841@@ -10574,7 +10574,7 @@ WERROR _spoolss_5b(struct pipes_struct * 5842 WERROR _spoolss_5c(struct pipes_struct *p, 5843 struct spoolss_5c *r) 5844 { 5845- p->rng_fault_state = true; 5846+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5847 return WERR_NOT_SUPPORTED; 5848 } 5849 5850@@ -10585,7 +10585,7 @@ WERROR _spoolss_5c(struct pipes_struct * 5851 WERROR _spoolss_5d(struct pipes_struct *p, 5852 struct spoolss_5d *r) 5853 { 5854- p->rng_fault_state = true; 5855+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5856 return WERR_NOT_SUPPORTED; 5857 } 5858 5859@@ -10596,7 +10596,7 @@ WERROR _spoolss_5d(struct pipes_struct * 5860 WERROR _spoolss_5e(struct pipes_struct *p, 5861 struct spoolss_5e *r) 5862 { 5863- p->rng_fault_state = true; 5864+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5865 return WERR_NOT_SUPPORTED; 5866 } 5867 5868@@ -10607,7 +10607,7 @@ WERROR _spoolss_5e(struct pipes_struct * 5869 WERROR _spoolss_5f(struct pipes_struct *p, 5870 struct spoolss_5f *r) 5871 { 5872- p->rng_fault_state = true; 5873+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5874 return WERR_NOT_SUPPORTED; 5875 } 5876 5877@@ -10618,7 +10618,7 @@ WERROR _spoolss_5f(struct pipes_struct * 5878 WERROR _spoolss_60(struct pipes_struct *p, 5879 struct spoolss_60 *r) 5880 { 5881- p->rng_fault_state = true; 5882+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5883 return WERR_NOT_SUPPORTED; 5884 } 5885 5886@@ -10629,7 +10629,7 @@ WERROR _spoolss_60(struct pipes_struct * 5887 WERROR _spoolss_61(struct pipes_struct *p, 5888 struct spoolss_61 *r) 5889 { 5890- p->rng_fault_state = true; 5891+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5892 return WERR_NOT_SUPPORTED; 5893 } 5894 5895@@ -10640,7 +10640,7 @@ WERROR _spoolss_61(struct pipes_struct * 5896 WERROR _spoolss_62(struct pipes_struct *p, 5897 struct spoolss_62 *r) 5898 { 5899- p->rng_fault_state = true; 5900+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5901 return WERR_NOT_SUPPORTED; 5902 } 5903 5904@@ -10651,7 +10651,7 @@ WERROR _spoolss_62(struct pipes_struct * 5905 WERROR _spoolss_63(struct pipes_struct *p, 5906 struct spoolss_63 *r) 5907 { 5908- p->rng_fault_state = true; 5909+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5910 return WERR_NOT_SUPPORTED; 5911 } 5912 5913@@ -10662,7 +10662,7 @@ WERROR _spoolss_63(struct pipes_struct * 5914 WERROR _spoolss_64(struct pipes_struct *p, 5915 struct spoolss_64 *r) 5916 { 5917- p->rng_fault_state = true; 5918+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5919 return WERR_NOT_SUPPORTED; 5920 } 5921 5922@@ -10673,7 +10673,7 @@ WERROR _spoolss_64(struct pipes_struct * 5923 WERROR _spoolss_65(struct pipes_struct *p, 5924 struct spoolss_65 *r) 5925 { 5926- p->rng_fault_state = true; 5927+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5928 return WERR_NOT_SUPPORTED; 5929 } 5930 5931@@ -10684,7 +10684,7 @@ WERROR _spoolss_65(struct pipes_struct * 5932 WERROR _spoolss_GetCorePrinterDrivers(struct pipes_struct *p, 5933 struct spoolss_GetCorePrinterDrivers *r) 5934 { 5935- p->rng_fault_state = true; 5936+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5937 return WERR_NOT_SUPPORTED; 5938 } 5939 5940@@ -10695,7 +10695,7 @@ WERROR _spoolss_GetCorePrinterDrivers(st 5941 WERROR _spoolss_67(struct pipes_struct *p, 5942 struct spoolss_67 *r) 5943 { 5944- p->rng_fault_state = true; 5945+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5946 return WERR_NOT_SUPPORTED; 5947 } 5948 5949@@ -10706,7 +10706,7 @@ WERROR _spoolss_67(struct pipes_struct * 5950 WERROR _spoolss_GetPrinterDriverPackagePath(struct pipes_struct *p, 5951 struct spoolss_GetPrinterDriverPackagePath *r) 5952 { 5953- p->rng_fault_state = true; 5954+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5955 return WERR_NOT_SUPPORTED; 5956 } 5957 5958@@ -10717,7 +10717,7 @@ WERROR _spoolss_GetPrinterDriverPackageP 5959 WERROR _spoolss_69(struct pipes_struct *p, 5960 struct spoolss_69 *r) 5961 { 5962- p->rng_fault_state = true; 5963+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5964 return WERR_NOT_SUPPORTED; 5965 } 5966 5967@@ -10728,7 +10728,7 @@ WERROR _spoolss_69(struct pipes_struct * 5968 WERROR _spoolss_6a(struct pipes_struct *p, 5969 struct spoolss_6a *r) 5970 { 5971- p->rng_fault_state = true; 5972+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5973 return WERR_NOT_SUPPORTED; 5974 } 5975 5976@@ -10739,7 +10739,7 @@ WERROR _spoolss_6a(struct pipes_struct * 5977 WERROR _spoolss_6b(struct pipes_struct *p, 5978 struct spoolss_6b *r) 5979 { 5980- p->rng_fault_state = true; 5981+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5982 return WERR_NOT_SUPPORTED; 5983 } 5984 5985@@ -10750,7 +10750,7 @@ WERROR _spoolss_6b(struct pipes_struct * 5986 WERROR _spoolss_6c(struct pipes_struct *p, 5987 struct spoolss_6c *r) 5988 { 5989- p->rng_fault_state = true; 5990+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 5991 return WERR_NOT_SUPPORTED; 5992 } 5993 5994@@ -10761,6 +10761,6 @@ WERROR _spoolss_6c(struct pipes_struct * 5995 WERROR _spoolss_6d(struct pipes_struct *p, 5996 struct spoolss_6d *r) 5997 { 5998- p->rng_fault_state = true; 5999+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6000 return WERR_NOT_SUPPORTED; 6001 } 6002--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c 6003+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c 6004@@ -2548,244 +2548,244 @@ WERROR _srvsvc_NetFileClose(struct pipes 6005 WERROR _srvsvc_NetCharDevEnum(struct pipes_struct *p, 6006 struct srvsvc_NetCharDevEnum *r) 6007 { 6008- p->rng_fault_state = True; 6009+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6010 return WERR_NOT_SUPPORTED; 6011 } 6012 6013 WERROR _srvsvc_NetCharDevGetInfo(struct pipes_struct *p, 6014 struct srvsvc_NetCharDevGetInfo *r) 6015 { 6016- p->rng_fault_state = True; 6017+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6018 return WERR_NOT_SUPPORTED; 6019 } 6020 6021 WERROR _srvsvc_NetCharDevControl(struct pipes_struct *p, 6022 struct srvsvc_NetCharDevControl *r) 6023 { 6024- p->rng_fault_state = True; 6025+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6026 return WERR_NOT_SUPPORTED; 6027 } 6028 6029 WERROR _srvsvc_NetCharDevQEnum(struct pipes_struct *p, 6030 struct srvsvc_NetCharDevQEnum *r) 6031 { 6032- p->rng_fault_state = True; 6033+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6034 return WERR_NOT_SUPPORTED; 6035 } 6036 6037 WERROR _srvsvc_NetCharDevQGetInfo(struct pipes_struct *p, 6038 struct srvsvc_NetCharDevQGetInfo *r) 6039 { 6040- p->rng_fault_state = True; 6041+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6042 return WERR_NOT_SUPPORTED; 6043 } 6044 6045 WERROR _srvsvc_NetCharDevQSetInfo(struct pipes_struct *p, 6046 struct srvsvc_NetCharDevQSetInfo *r) 6047 { 6048- p->rng_fault_state = True; 6049+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6050 return WERR_NOT_SUPPORTED; 6051 } 6052 6053 WERROR _srvsvc_NetCharDevQPurge(struct pipes_struct *p, 6054 struct srvsvc_NetCharDevQPurge *r) 6055 { 6056- p->rng_fault_state = True; 6057+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6058 return WERR_NOT_SUPPORTED; 6059 } 6060 6061 WERROR _srvsvc_NetCharDevQPurgeSelf(struct pipes_struct *p, 6062 struct srvsvc_NetCharDevQPurgeSelf *r) 6063 { 6064- p->rng_fault_state = True; 6065+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6066 return WERR_NOT_SUPPORTED; 6067 } 6068 6069 WERROR _srvsvc_NetFileGetInfo(struct pipes_struct *p, 6070 struct srvsvc_NetFileGetInfo *r) 6071 { 6072- p->rng_fault_state = True; 6073+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6074 return WERR_NOT_SUPPORTED; 6075 } 6076 6077 WERROR _srvsvc_NetShareCheck(struct pipes_struct *p, 6078 struct srvsvc_NetShareCheck *r) 6079 { 6080- p->rng_fault_state = True; 6081+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6082 return WERR_NOT_SUPPORTED; 6083 } 6084 6085 WERROR _srvsvc_NetServerStatisticsGet(struct pipes_struct *p, 6086 struct srvsvc_NetServerStatisticsGet *r) 6087 { 6088- p->rng_fault_state = True; 6089+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6090 return WERR_NOT_SUPPORTED; 6091 } 6092 6093 WERROR _srvsvc_NetTransportAdd(struct pipes_struct *p, 6094 struct srvsvc_NetTransportAdd *r) 6095 { 6096- p->rng_fault_state = True; 6097+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6098 return WERR_NOT_SUPPORTED; 6099 } 6100 6101 WERROR _srvsvc_NetTransportEnum(struct pipes_struct *p, 6102 struct srvsvc_NetTransportEnum *r) 6103 { 6104- p->rng_fault_state = True; 6105+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6106 return WERR_NOT_SUPPORTED; 6107 } 6108 6109 WERROR _srvsvc_NetTransportDel(struct pipes_struct *p, 6110 struct srvsvc_NetTransportDel *r) 6111 { 6112- p->rng_fault_state = True; 6113+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6114 return WERR_NOT_SUPPORTED; 6115 } 6116 6117 WERROR _srvsvc_NetSetServiceBits(struct pipes_struct *p, 6118 struct srvsvc_NetSetServiceBits *r) 6119 { 6120- p->rng_fault_state = True; 6121+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6122 return WERR_NOT_SUPPORTED; 6123 } 6124 6125 WERROR _srvsvc_NetPathType(struct pipes_struct *p, 6126 struct srvsvc_NetPathType *r) 6127 { 6128- p->rng_fault_state = True; 6129+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6130 return WERR_NOT_SUPPORTED; 6131 } 6132 6133 WERROR _srvsvc_NetPathCanonicalize(struct pipes_struct *p, 6134 struct srvsvc_NetPathCanonicalize *r) 6135 { 6136- p->rng_fault_state = True; 6137+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6138 return WERR_NOT_SUPPORTED; 6139 } 6140 6141 WERROR _srvsvc_NetPathCompare(struct pipes_struct *p, 6142 struct srvsvc_NetPathCompare *r) 6143 { 6144- p->rng_fault_state = True; 6145+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6146 return WERR_NOT_SUPPORTED; 6147 } 6148 6149 WERROR _srvsvc_NETRPRNAMECANONICALIZE(struct pipes_struct *p, 6150 struct srvsvc_NETRPRNAMECANONICALIZE *r) 6151 { 6152- p->rng_fault_state = True; 6153+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6154 return WERR_NOT_SUPPORTED; 6155 } 6156 6157 WERROR _srvsvc_NetPRNameCompare(struct pipes_struct *p, 6158 struct srvsvc_NetPRNameCompare *r) 6159 { 6160- p->rng_fault_state = True; 6161+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6162 return WERR_NOT_SUPPORTED; 6163 } 6164 6165 WERROR _srvsvc_NetShareDelStart(struct pipes_struct *p, 6166 struct srvsvc_NetShareDelStart *r) 6167 { 6168- p->rng_fault_state = True; 6169+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6170 return WERR_NOT_SUPPORTED; 6171 } 6172 6173 WERROR _srvsvc_NetShareDelCommit(struct pipes_struct *p, 6174 struct srvsvc_NetShareDelCommit *r) 6175 { 6176- p->rng_fault_state = True; 6177+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6178 return WERR_NOT_SUPPORTED; 6179 } 6180 6181 WERROR _srvsvc_NetServerTransportAddEx(struct pipes_struct *p, 6182 struct srvsvc_NetServerTransportAddEx *r) 6183 { 6184- p->rng_fault_state = True; 6185+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6186 return WERR_NOT_SUPPORTED; 6187 } 6188 6189 WERROR _srvsvc_NetServerSetServiceBitsEx(struct pipes_struct *p, 6190 struct srvsvc_NetServerSetServiceBitsEx *r) 6191 { 6192- p->rng_fault_state = True; 6193+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6194 return WERR_NOT_SUPPORTED; 6195 } 6196 6197 WERROR _srvsvc_NETRDFSGETVERSION(struct pipes_struct *p, 6198 struct srvsvc_NETRDFSGETVERSION *r) 6199 { 6200- p->rng_fault_state = True; 6201+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6202 return WERR_NOT_SUPPORTED; 6203 } 6204 6205 WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(struct pipes_struct *p, 6206 struct srvsvc_NETRDFSCREATELOCALPARTITION *r) 6207 { 6208- p->rng_fault_state = True; 6209+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6210 return WERR_NOT_SUPPORTED; 6211 } 6212 6213 WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(struct pipes_struct *p, 6214 struct srvsvc_NETRDFSDELETELOCALPARTITION *r) 6215 { 6216- p->rng_fault_state = True; 6217+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6218 return WERR_NOT_SUPPORTED; 6219 } 6220 6221 WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct pipes_struct *p, 6222 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r) 6223 { 6224- p->rng_fault_state = True; 6225+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6226 return WERR_NOT_SUPPORTED; 6227 } 6228 6229 WERROR _srvsvc_NETRDFSSETSERVERINFO(struct pipes_struct *p, 6230 struct srvsvc_NETRDFSSETSERVERINFO *r) 6231 { 6232- p->rng_fault_state = True; 6233+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6234 return WERR_NOT_SUPPORTED; 6235 } 6236 6237 WERROR _srvsvc_NETRDFSCREATEEXITPOINT(struct pipes_struct *p, 6238 struct srvsvc_NETRDFSCREATEEXITPOINT *r) 6239 { 6240- p->rng_fault_state = True; 6241+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6242 return WERR_NOT_SUPPORTED; 6243 } 6244 6245 WERROR _srvsvc_NETRDFSDELETEEXITPOINT(struct pipes_struct *p, 6246 struct srvsvc_NETRDFSDELETEEXITPOINT *r) 6247 { 6248- p->rng_fault_state = True; 6249+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6250 return WERR_NOT_SUPPORTED; 6251 } 6252 6253 WERROR _srvsvc_NETRDFSMODIFYPREFIX(struct pipes_struct *p, 6254 struct srvsvc_NETRDFSMODIFYPREFIX *r) 6255 { 6256- p->rng_fault_state = True; 6257+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6258 return WERR_NOT_SUPPORTED; 6259 } 6260 6261 WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(struct pipes_struct *p, 6262 struct srvsvc_NETRDFSFIXLOCALVOLUME *r) 6263 { 6264- p->rng_fault_state = True; 6265+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6266 return WERR_NOT_SUPPORTED; 6267 } 6268 6269 WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct pipes_struct *p, 6270 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r) 6271 { 6272- p->rng_fault_state = True; 6273+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6274 return WERR_NOT_SUPPORTED; 6275 } 6276 6277 WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(struct pipes_struct *p, 6278 struct srvsvc_NETRSERVERTRANSPORTDELEX *r) 6279 { 6280- p->rng_fault_state = True; 6281+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6282 return WERR_NOT_SUPPORTED; 6283 } 6284--- a/source3/rpc_server/svcctl/srv_svcctl_nt.c 6285+++ b/source3/rpc_server/svcctl/srv_svcctl_nt.c 6286@@ -1004,195 +1004,195 @@ WERROR _svcctl_SetServiceObjectSecurity( 6287 WERROR _svcctl_DeleteService(struct pipes_struct *p, 6288 struct svcctl_DeleteService *r) 6289 { 6290- p->rng_fault_state = True; 6291+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6292 return WERR_NOT_SUPPORTED; 6293 } 6294 6295 WERROR _svcctl_SetServiceStatus(struct pipes_struct *p, 6296 struct svcctl_SetServiceStatus *r) 6297 { 6298- p->rng_fault_state = True; 6299+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6300 return WERR_NOT_SUPPORTED; 6301 } 6302 6303 WERROR _svcctl_NotifyBootConfigStatus(struct pipes_struct *p, 6304 struct svcctl_NotifyBootConfigStatus *r) 6305 { 6306- p->rng_fault_state = True; 6307+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6308 return WERR_NOT_SUPPORTED; 6309 } 6310 6311 WERROR _svcctl_SCSetServiceBitsW(struct pipes_struct *p, 6312 struct svcctl_SCSetServiceBitsW *r) 6313 { 6314- p->rng_fault_state = True; 6315+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6316 return WERR_NOT_SUPPORTED; 6317 } 6318 6319 WERROR _svcctl_ChangeServiceConfigW(struct pipes_struct *p, 6320 struct svcctl_ChangeServiceConfigW *r) 6321 { 6322- p->rng_fault_state = True; 6323+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6324 return WERR_NOT_SUPPORTED; 6325 } 6326 6327 WERROR _svcctl_CreateServiceW(struct pipes_struct *p, 6328 struct svcctl_CreateServiceW *r) 6329 { 6330- p->rng_fault_state = True; 6331+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6332 return WERR_NOT_SUPPORTED; 6333 } 6334 6335 WERROR _svcctl_QueryServiceLockStatusW(struct pipes_struct *p, 6336 struct svcctl_QueryServiceLockStatusW *r) 6337 { 6338- p->rng_fault_state = True; 6339+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6340 return WERR_NOT_SUPPORTED; 6341 } 6342 6343 WERROR _svcctl_GetServiceKeyNameW(struct pipes_struct *p, 6344 struct svcctl_GetServiceKeyNameW *r) 6345 { 6346- p->rng_fault_state = True; 6347+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6348 return WERR_NOT_SUPPORTED; 6349 } 6350 6351 WERROR _svcctl_SCSetServiceBitsA(struct pipes_struct *p, 6352 struct svcctl_SCSetServiceBitsA *r) 6353 { 6354- p->rng_fault_state = True; 6355+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6356 return WERR_NOT_SUPPORTED; 6357 } 6358 6359 WERROR _svcctl_ChangeServiceConfigA(struct pipes_struct *p, 6360 struct svcctl_ChangeServiceConfigA *r) 6361 { 6362- p->rng_fault_state = True; 6363+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6364 return WERR_NOT_SUPPORTED; 6365 } 6366 6367 WERROR _svcctl_CreateServiceA(struct pipes_struct *p, 6368 struct svcctl_CreateServiceA *r) 6369 { 6370- p->rng_fault_state = True; 6371+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6372 return WERR_NOT_SUPPORTED; 6373 } 6374 6375 WERROR _svcctl_EnumDependentServicesA(struct pipes_struct *p, 6376 struct svcctl_EnumDependentServicesA *r) 6377 { 6378- p->rng_fault_state = True; 6379+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6380 return WERR_NOT_SUPPORTED; 6381 } 6382 6383 WERROR _svcctl_EnumServicesStatusA(struct pipes_struct *p, 6384 struct svcctl_EnumServicesStatusA *r) 6385 { 6386- p->rng_fault_state = True; 6387+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6388 return WERR_NOT_SUPPORTED; 6389 } 6390 6391 WERROR _svcctl_OpenSCManagerA(struct pipes_struct *p, 6392 struct svcctl_OpenSCManagerA *r) 6393 { 6394- p->rng_fault_state = True; 6395+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6396 return WERR_NOT_SUPPORTED; 6397 } 6398 6399 WERROR _svcctl_OpenServiceA(struct pipes_struct *p, 6400 struct svcctl_OpenServiceA *r) 6401 { 6402- p->rng_fault_state = True; 6403+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6404 return WERR_NOT_SUPPORTED; 6405 } 6406 6407 WERROR _svcctl_QueryServiceConfigA(struct pipes_struct *p, 6408 struct svcctl_QueryServiceConfigA *r) 6409 { 6410- p->rng_fault_state = True; 6411+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6412 return WERR_NOT_SUPPORTED; 6413 } 6414 6415 WERROR _svcctl_QueryServiceLockStatusA(struct pipes_struct *p, 6416 struct svcctl_QueryServiceLockStatusA *r) 6417 { 6418- p->rng_fault_state = True; 6419+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6420 return WERR_NOT_SUPPORTED; 6421 } 6422 6423 WERROR _svcctl_StartServiceA(struct pipes_struct *p, 6424 struct svcctl_StartServiceA *r) 6425 { 6426- p->rng_fault_state = True; 6427+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6428 return WERR_NOT_SUPPORTED; 6429 } 6430 6431 WERROR _svcctl_GetServiceDisplayNameA(struct pipes_struct *p, 6432 struct svcctl_GetServiceDisplayNameA *r) 6433 { 6434- p->rng_fault_state = True; 6435+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6436 return WERR_NOT_SUPPORTED; 6437 } 6438 6439 WERROR _svcctl_GetServiceKeyNameA(struct pipes_struct *p, 6440 struct svcctl_GetServiceKeyNameA *r) 6441 { 6442- p->rng_fault_state = True; 6443+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6444 return WERR_NOT_SUPPORTED; 6445 } 6446 6447 WERROR _svcctl_GetCurrentGroupeStateW(struct pipes_struct *p, 6448 struct svcctl_GetCurrentGroupeStateW *r) 6449 { 6450- p->rng_fault_state = True; 6451+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6452 return WERR_NOT_SUPPORTED; 6453 } 6454 6455 WERROR _svcctl_EnumServiceGroupW(struct pipes_struct *p, 6456 struct svcctl_EnumServiceGroupW *r) 6457 { 6458- p->rng_fault_state = True; 6459+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6460 return WERR_NOT_SUPPORTED; 6461 } 6462 6463 WERROR _svcctl_ChangeServiceConfig2A(struct pipes_struct *p, 6464 struct svcctl_ChangeServiceConfig2A *r) 6465 { 6466- p->rng_fault_state = True; 6467+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6468 return WERR_NOT_SUPPORTED; 6469 } 6470 6471 WERROR _svcctl_ChangeServiceConfig2W(struct pipes_struct *p, 6472 struct svcctl_ChangeServiceConfig2W *r) 6473 { 6474- p->rng_fault_state = True; 6475+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6476 return WERR_NOT_SUPPORTED; 6477 } 6478 6479 WERROR _svcctl_QueryServiceConfig2A(struct pipes_struct *p, 6480 struct svcctl_QueryServiceConfig2A *r) 6481 { 6482- p->rng_fault_state = True; 6483+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6484 return WERR_NOT_SUPPORTED; 6485 } 6486 6487 WERROR _EnumServicesStatusExA(struct pipes_struct *p, 6488 struct EnumServicesStatusExA *r) 6489 { 6490- p->rng_fault_state = True; 6491+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6492 return WERR_NOT_SUPPORTED; 6493 } 6494 6495 WERROR _EnumServicesStatusExW(struct pipes_struct *p, 6496 struct EnumServicesStatusExW *r) 6497 { 6498- p->rng_fault_state = True; 6499+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6500 return WERR_NOT_SUPPORTED; 6501 } 6502 6503 WERROR _svcctl_SCSendTSMessage(struct pipes_struct *p, 6504 struct svcctl_SCSendTSMessage *r) 6505 { 6506- p->rng_fault_state = True; 6507+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6508 return WERR_NOT_SUPPORTED; 6509 } 6510--- a/source3/rpc_server/winreg/srv_winreg_nt.c 6511+++ b/source3/rpc_server/winreg/srv_winreg_nt.c 6512@@ -760,7 +760,7 @@ WERROR _winreg_SaveKeyEx(struct pipes_st 6513 /* fill in your code here if you think this call should 6514 do anything */ 6515 6516- p->rng_fault_state = True; 6517+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6518 return WERR_NOT_SUPPORTED; 6519 } 6520 6521@@ -948,7 +948,7 @@ WERROR _winreg_UnLoadKey(struct pipes_st 6522 /* fill in your code here if you think this call should 6523 do anything */ 6524 6525- p->rng_fault_state = True; 6526+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6527 return WERR_NOT_SUPPORTED; 6528 } 6529 6530@@ -962,7 +962,7 @@ WERROR _winreg_ReplaceKey(struct pipes_s 6531 /* fill in your code here if you think this call should 6532 do anything */ 6533 6534- p->rng_fault_state = True; 6535+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6536 return WERR_NOT_SUPPORTED; 6537 } 6538 6539@@ -976,7 +976,7 @@ WERROR _winreg_LoadKey(struct pipes_stru 6540 /* fill in your code here if you think this call should 6541 do anything */ 6542 6543- p->rng_fault_state = True; 6544+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6545 return WERR_NOT_SUPPORTED; 6546 } 6547 6548@@ -1139,6 +1139,6 @@ WERROR _winreg_DeleteKeyEx(struct pipes_ 6549 /* fill in your code here if you think this call should 6550 do anything */ 6551 6552- p->rng_fault_state = True; 6553+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6554 return WERR_NOT_SUPPORTED; 6555 } 6556--- a/source3/rpc_server/wkssvc/srv_wkssvc_nt.c 6557+++ b/source3/rpc_server/wkssvc/srv_wkssvc_nt.c 6558@@ -405,7 +405,7 @@ WERROR _wkssvc_NetWkstaSetInfo(struct pi 6559 struct wkssvc_NetWkstaSetInfo *r) 6560 { 6561 /* FIXME: Add implementation code here */ 6562- p->rng_fault_state = True; 6563+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6564 return WERR_NOT_SUPPORTED; 6565 } 6566 6567@@ -608,7 +608,7 @@ WERROR _wkssvc_NetrWkstaUserGetInfo(stru 6568 struct wkssvc_NetrWkstaUserGetInfo *r) 6569 { 6570 /* FIXME: Add implementation code here */ 6571- p->rng_fault_state = True; 6572+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6573 return WERR_NOT_SUPPORTED; 6574 } 6575 6576@@ -619,7 +619,7 @@ WERROR _wkssvc_NetrWkstaUserSetInfo(stru 6577 struct wkssvc_NetrWkstaUserSetInfo *r) 6578 { 6579 /* FIXME: Add implementation code here */ 6580- p->rng_fault_state = True; 6581+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6582 return WERR_NOT_SUPPORTED; 6583 } 6584 6585@@ -630,7 +630,7 @@ WERROR _wkssvc_NetWkstaTransportEnum(str 6586 struct wkssvc_NetWkstaTransportEnum *r) 6587 { 6588 /* FIXME: Add implementation code here */ 6589- p->rng_fault_state = True; 6590+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6591 return WERR_NOT_SUPPORTED; 6592 } 6593 6594@@ -641,7 +641,7 @@ WERROR _wkssvc_NetrWkstaTransportAdd(str 6595 struct wkssvc_NetrWkstaTransportAdd *r) 6596 { 6597 /* FIXME: Add implementation code here */ 6598- p->rng_fault_state = True; 6599+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6600 return WERR_NOT_SUPPORTED; 6601 } 6602 6603@@ -652,7 +652,7 @@ WERROR _wkssvc_NetrWkstaTransportDel(str 6604 struct wkssvc_NetrWkstaTransportDel *r) 6605 { 6606 /* FIXME: Add implementation code here */ 6607- p->rng_fault_state = True; 6608+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6609 return WERR_NOT_SUPPORTED; 6610 } 6611 6612@@ -663,7 +663,7 @@ WERROR _wkssvc_NetrUseAdd(struct pipes_s 6613 struct wkssvc_NetrUseAdd *r) 6614 { 6615 /* FIXME: Add implementation code here */ 6616- p->rng_fault_state = True; 6617+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6618 return WERR_NOT_SUPPORTED; 6619 } 6620 6621@@ -674,7 +674,7 @@ WERROR _wkssvc_NetrUseGetInfo(struct pip 6622 struct wkssvc_NetrUseGetInfo *r) 6623 { 6624 /* FIXME: Add implementation code here */ 6625- p->rng_fault_state = True; 6626+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6627 return WERR_NOT_SUPPORTED; 6628 } 6629 6630@@ -685,7 +685,7 @@ WERROR _wkssvc_NetrUseDel(struct pipes_s 6631 struct wkssvc_NetrUseDel *r) 6632 { 6633 /* FIXME: Add implementation code here */ 6634- p->rng_fault_state = True; 6635+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6636 return WERR_NOT_SUPPORTED; 6637 } 6638 6639@@ -696,7 +696,7 @@ WERROR _wkssvc_NetrUseEnum(struct pipes_ 6640 struct wkssvc_NetrUseEnum *r) 6641 { 6642 /* FIXME: Add implementation code here */ 6643- p->rng_fault_state = True; 6644+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6645 return WERR_NOT_SUPPORTED; 6646 } 6647 6648@@ -707,7 +707,7 @@ WERROR _wkssvc_NetrMessageBufferSend(str 6649 struct wkssvc_NetrMessageBufferSend *r) 6650 { 6651 /* FIXME: Add implementation code here */ 6652- p->rng_fault_state = True; 6653+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6654 return WERR_NOT_SUPPORTED; 6655 } 6656 6657@@ -718,7 +718,7 @@ WERROR _wkssvc_NetrWorkstationStatistics 6658 struct wkssvc_NetrWorkstationStatisticsGet *r) 6659 { 6660 /* FIXME: Add implementation code here */ 6661- p->rng_fault_state = True; 6662+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6663 return WERR_NOT_SUPPORTED; 6664 } 6665 6666@@ -729,7 +729,7 @@ WERROR _wkssvc_NetrLogonDomainNameAdd(st 6667 struct wkssvc_NetrLogonDomainNameAdd *r) 6668 { 6669 /* FIXME: Add implementation code here */ 6670- p->rng_fault_state = True; 6671+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6672 return WERR_NOT_SUPPORTED; 6673 } 6674 6675@@ -740,7 +740,7 @@ WERROR _wkssvc_NetrLogonDomainNameDel(st 6676 struct wkssvc_NetrLogonDomainNameDel *r) 6677 { 6678 /* FIXME: Add implementation code here */ 6679- p->rng_fault_state = True; 6680+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6681 return WERR_NOT_SUPPORTED; 6682 } 6683 6684@@ -751,7 +751,7 @@ WERROR _wkssvc_NetrJoinDomain(struct pip 6685 struct wkssvc_NetrJoinDomain *r) 6686 { 6687 /* FIXME: Add implementation code here */ 6688- p->rng_fault_state = True; 6689+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6690 return WERR_NOT_SUPPORTED; 6691 } 6692 6693@@ -762,7 +762,7 @@ WERROR _wkssvc_NetrUnjoinDomain(struct p 6694 struct wkssvc_NetrUnjoinDomain *r) 6695 { 6696 /* FIXME: Add implementation code here */ 6697- p->rng_fault_state = True; 6698+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6699 return WERR_NOT_SUPPORTED; 6700 } 6701 6702@@ -773,7 +773,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain 6703 struct wkssvc_NetrRenameMachineInDomain *r) 6704 { 6705 /* FIXME: Add implementation code here */ 6706- p->rng_fault_state = True; 6707+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6708 return WERR_NOT_SUPPORTED; 6709 } 6710 6711@@ -784,7 +784,7 @@ WERROR _wkssvc_NetrValidateName(struct p 6712 struct wkssvc_NetrValidateName *r) 6713 { 6714 /* FIXME: Add implementation code here */ 6715- p->rng_fault_state = True; 6716+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6717 return WERR_NOT_SUPPORTED; 6718 } 6719 6720@@ -795,7 +795,7 @@ WERROR _wkssvc_NetrGetJoinInformation(st 6721 struct wkssvc_NetrGetJoinInformation *r) 6722 { 6723 /* FIXME: Add implementation code here */ 6724- p->rng_fault_state = True; 6725+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6726 return WERR_NOT_SUPPORTED; 6727 } 6728 6729@@ -806,7 +806,7 @@ WERROR _wkssvc_NetrGetJoinableOus(struct 6730 struct wkssvc_NetrGetJoinableOus *r) 6731 { 6732 /* FIXME: Add implementation code here */ 6733- p->rng_fault_state = True; 6734+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6735 return WERR_NOT_SUPPORTED; 6736 } 6737 6738@@ -962,6 +962,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain 6739 struct wkssvc_NetrRenameMachineInDomain2 *r) 6740 { 6741 /* for now just return not supported */ 6742+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6743 return WERR_NOT_SUPPORTED; 6744 } 6745 6746@@ -972,7 +973,7 @@ WERROR _wkssvc_NetrValidateName2(struct 6747 struct wkssvc_NetrValidateName2 *r) 6748 { 6749 /* FIXME: Add implementation code here */ 6750- p->rng_fault_state = True; 6751+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6752 return WERR_NOT_SUPPORTED; 6753 } 6754 6755@@ -983,7 +984,7 @@ WERROR _wkssvc_NetrGetJoinableOus2(struc 6756 struct wkssvc_NetrGetJoinableOus2 *r) 6757 { 6758 /* FIXME: Add implementation code here */ 6759- p->rng_fault_state = True; 6760+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6761 return WERR_NOT_SUPPORTED; 6762 } 6763 6764@@ -994,7 +995,7 @@ WERROR _wkssvc_NetrAddAlternateComputerN 6765 struct wkssvc_NetrAddAlternateComputerName *r) 6766 { 6767 /* FIXME: Add implementation code here */ 6768- p->rng_fault_state = True; 6769+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6770 return WERR_NOT_SUPPORTED; 6771 } 6772 6773@@ -1005,7 +1006,7 @@ WERROR _wkssvc_NetrRemoveAlternateComput 6774 struct wkssvc_NetrRemoveAlternateComputerName *r) 6775 { 6776 /* FIXME: Add implementation code here */ 6777- p->rng_fault_state = True; 6778+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6779 return WERR_NOT_SUPPORTED; 6780 } 6781 6782@@ -1016,7 +1017,7 @@ WERROR _wkssvc_NetrSetPrimaryComputernam 6783 struct wkssvc_NetrSetPrimaryComputername *r) 6784 { 6785 /* FIXME: Add implementation code here */ 6786- p->rng_fault_state = True; 6787+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6788 return WERR_NOT_SUPPORTED; 6789 } 6790 6791@@ -1027,6 +1028,6 @@ WERROR _wkssvc_NetrEnumerateComputerName 6792 struct wkssvc_NetrEnumerateComputerNames *r) 6793 { 6794 /* FIXME: Add implementation code here */ 6795- p->rng_fault_state = True; 6796+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR; 6797 return WERR_NOT_SUPPORTED; 6798 } 6799--- a/libcli/auth/smbencrypt.c 6800+++ b/libcli/auth/smbencrypt.c 6801@@ -355,11 +355,18 @@ DATA_BLOB NTLMv2_generate_names_blob(TAL 6802 DATA_BLOB names_blob = data_blob_talloc(mem_ctx, NULL, 0); 6803 6804 /* Deliberately ignore return here.. */ 6805- (void)msrpc_gen(mem_ctx, &names_blob, 6806- "aaa", 6807- MsvAvNbDomainName, domain, 6808- MsvAvNbComputerName, hostname, 6809- MsvAvEOL, ""); 6810+ if (hostname != NULL) { 6811+ (void)msrpc_gen(mem_ctx, &names_blob, 6812+ "aaa", 6813+ MsvAvNbDomainName, domain, 6814+ MsvAvNbComputerName, hostname, 6815+ MsvAvEOL, ""); 6816+ } else { 6817+ (void)msrpc_gen(mem_ctx, &names_blob, 6818+ "aa", 6819+ MsvAvNbDomainName, domain, 6820+ MsvAvEOL, ""); 6821+ } 6822 return names_blob; 6823 } 6824 6825