samba: fix some security problems
[openwrt.git] / package / network / services / samba36 / patches / 020-CVE-preparation-v3-6.patch
1 From 39a3fa39967faaf216be8e108ca57d07de1aa95a Mon Sep 17 00:00:00 2001
2 From: Vadim Zhukov <persgray@gmail.com>
3 Date: Sat, 25 May 2013 15:19:24 +0100
4 Subject: [PATCH 01/41] pidl: Recent Perl warns about "defined(@var)"
5  constructs.
6
7 Signed-off-by: Jelmer Vernooij <jelmer@samba.org>
8
9 Autobuild-User(master): Jelmer Vernooij <jelmer@samba.org>
10 Autobuild-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