mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
6825 lines
228 KiB
Diff
6825 lines
228 KiB
Diff
|
From 39a3fa39967faaf216be8e108ca57d07de1aa95a Mon Sep 17 00:00:00 2001
|
||
|
From: Vadim Zhukov <persgray@gmail.com>
|
||
|
Date: Sat, 25 May 2013 15:19:24 +0100
|
||
|
Subject: [PATCH 01/41] pidl: Recent Perl warns about "defined(@var)"
|
||
|
constructs.
|
||
|
|
||
|
Signed-off-by: Jelmer Vernooij <jelmer@samba.org>
|
||
|
|
||
|
Autobuild-User(master): Jelmer Vernooij <jelmer@samba.org>
|
||
|
Autobuild-Date(master): Sat May 25 18:10:53 CEST 2013 on sn-devel-104
|
||
|
|
||
|
(cherry picked from commit 92254d09e0ee5a7d9d0cd91fe1803f54e64d9a5f)
|
||
|
---
|
||
|
pidl/lib/Parse/Pidl/ODL.pm | 2 +-
|
||
|
pidl/pidl | 2 +-
|
||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
--- a/pidl/lib/Parse/Pidl/ODL.pm
|
||
|
+++ b/pidl/lib/Parse/Pidl/ODL.pm
|
||
|
@@ -70,7 +70,7 @@ sub ODL2IDL
|
||
|
next;
|
||
|
}
|
||
|
my $podl = Parse::Pidl::IDL::parse_file($idl_path, $opt_incdirs);
|
||
|
- if (defined(@$podl)) {
|
||
|
+ if (defined($podl)) {
|
||
|
require Parse::Pidl::Typelist;
|
||
|
my $basename = basename($idl_path, ".idl");
|
||
|
|
||
|
--- a/pidl/pidl
|
||
|
+++ b/pidl/pidl
|
||
|
@@ -605,7 +605,7 @@ sub process_file($)
|
||
|
require Parse::Pidl::IDL;
|
||
|
|
||
|
$pidl = Parse::Pidl::IDL::parse_file($idl_file, \@opt_incdirs);
|
||
|
- defined @$pidl || die "Failed to parse $idl_file";
|
||
|
+ defined $pidl || die "Failed to parse $idl_file";
|
||
|
}
|
||
|
|
||
|
require Parse::Pidl::Typelist;
|
||
|
--- a/source4/heimdal/cf/make-proto.pl
|
||
|
+++ b/source4/heimdal/cf/make-proto.pl
|
||
|
@@ -1,8 +1,8 @@
|
||
|
# Make prototypes from .c files
|
||
|
# $Id$
|
||
|
|
||
|
-##use Getopt::Std;
|
||
|
-require 'getopts.pl';
|
||
|
+use Getopt::Std;
|
||
|
+#require 'getopts.pl';
|
||
|
|
||
|
my $comment = 0;
|
||
|
my $if_0 = 0;
|
||
|
@@ -12,7 +12,7 @@ my $debug = 0;
|
||
|
my $oproto = 1;
|
||
|
my $private_func_re = "^_";
|
||
|
|
||
|
-Getopts('x:m:o:p:dqE:R:P:') || die "foo";
|
||
|
+getopts('x:m:o:p:dqE:R:P:') || die "foo";
|
||
|
|
||
|
if($opt_d) {
|
||
|
$debug = 1;
|
||
|
--- a/source3/Makefile-smbtorture4
|
||
|
+++ b/source3/Makefile-smbtorture4
|
||
|
@@ -6,7 +6,7 @@ SAMBA4_BINARIES="smbtorture,ndrdump"
|
||
|
samba4-configure:
|
||
|
@(cd .. && \
|
||
|
CFLAGS='' $(WAF) reconfigure || \
|
||
|
- CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure )
|
||
|
+ CFLAGS='' $(WAF) configure --enable-socket-wrapper --enable-nss-wrapper --enable-uid-wrapper --nonshared-binary=$(SAMBA4_BINARIES) --enable-auto-reconfigure --bundled-libraries=ALL --disable-gnutls )
|
||
|
|
||
|
.PHONY: samba4-configure
|
||
|
|
||
|
--- a/source4/lib/ldb/wscript
|
||
|
+++ b/source4/lib/ldb/wscript
|
||
|
@@ -135,9 +135,7 @@ def build(bld):
|
||
|
pc_files=ldb_pc_files,
|
||
|
vnum=VERSION,
|
||
|
private_library=private_library,
|
||
|
- manpages='man/ldb.3',
|
||
|
- abi_directory = 'ABI',
|
||
|
- abi_match = abi_match)
|
||
|
+ manpages='man/ldb.3')
|
||
|
|
||
|
# generate a include/ldb_version.h
|
||
|
t = bld.SAMBA_GENERATOR('ldb_version.h',
|
||
|
--- a/source3/selftest/skip
|
||
|
+++ b/source3/selftest/skip
|
||
|
@@ -22,3 +22,8 @@ samba3.*raw.ioctl
|
||
|
samba3.*raw.qfileinfo
|
||
|
samba3.*raw.qfsinfo
|
||
|
samba3.*raw.sfileinfo.base
|
||
|
+# skip, don't work for badlock backports
|
||
|
+samba3.posix_s3.raw.eas
|
||
|
+samba3.posix_s3.raw.rename
|
||
|
+samba3.posix_s3.raw.search
|
||
|
+samba3.posix_s3.raw.streams
|
||
|
--- a/librpc/ndr/ndr_ntlmssp.c
|
||
|
+++ b/librpc/ndr/ndr_ntlmssp.c
|
||
|
@@ -176,4 +176,20 @@ _PUBLIC_ void ndr_print_ntlmssp_Version(
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list,
|
||
|
+ enum ntlmssp_AvId AvId)
|
||
|
+{
|
||
|
+ struct AV_PAIR *res = NULL;
|
||
|
+ uint32_t i = 0;
|
||
|
|
||
|
+ for (i = 0; i < av_list->count; i++) {
|
||
|
+ if (av_list->pair[i].AvId != AvId) {
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+
|
||
|
+ res = discard_const_p(struct AV_PAIR, &av_list->pair[i]);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ return res;
|
||
|
+}
|
||
|
--- a/librpc/ndr/ndr_ntlmssp.h
|
||
|
+++ b/librpc/ndr/ndr_ntlmssp.h
|
||
|
@@ -31,3 +31,5 @@ _PUBLIC_ void ndr_print_ntlmssp_lm_respo
|
||
|
bool ntlmv2);
|
||
|
_PUBLIC_ void ndr_print_ntlmssp_Version(struct ndr_print *ndr, const char *name, const union ntlmssp_Version *r);
|
||
|
|
||
|
+_PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list,
|
||
|
+ enum ntlmssp_AvId AvId);
|
||
|
--- /dev/null
|
||
|
+++ b/librpc/ABI/ndr-0.0.2.sigs
|
||
|
@@ -0,0 +1,247 @@
|
||
|
+GUID_all_zero: bool (const struct GUID *)
|
||
|
+GUID_compare: int (const struct GUID *, const struct GUID *)
|
||
|
+GUID_equal: bool (const struct GUID *, const struct GUID *)
|
||
|
+GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
|
||
|
+GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
|
||
|
+GUID_from_string: NTSTATUS (const char *, struct GUID *)
|
||
|
+GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_random: struct GUID (void)
|
||
|
+GUID_string: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_string2: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *)
|
||
|
+GUID_zero: struct GUID (void)
|
||
|
+ndr_align_size: size_t (uint32_t, size_t)
|
||
|
+ndr_charset_length: uint32_t (const void *, charset_t)
|
||
|
+ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
|
||
|
+ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
|
||
|
+ndr_check_padding: void (struct ndr_pull *, size_t)
|
||
|
+ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t)
|
||
|
+ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t)
|
||
|
+ndr_get_array_length: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_get_array_size: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_map_error2errno: int (enum ndr_err_code)
|
||
|
+ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code)
|
||
|
+ndr_map_error2string: const char *(enum ndr_err_code)
|
||
|
+ndr_policy_handle_empty: bool (const struct policy_handle *)
|
||
|
+ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *)
|
||
|
+ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB)
|
||
|
+ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *)
|
||
|
+ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS)
|
||
|
+ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR)
|
||
|
+ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t)
|
||
|
+ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t)
|
||
|
+ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t)
|
||
|
+ndr_print_bool: void (struct ndr_print *, const char *, const bool)
|
||
|
+ndr_print_debug: void (ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_debug_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_dlong: void (struct ndr_print *, const char *, int64_t)
|
||
|
+ndr_print_double: void (struct ndr_print *, const char *, double)
|
||
|
+ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t)
|
||
|
+ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *)
|
||
|
+ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *)
|
||
|
+ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *)
|
||
|
+ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t)
|
||
|
+ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_int16: void (struct ndr_print *, const char *, int16_t)
|
||
|
+ndr_print_int32: void (struct ndr_print *, const char *, int32_t)
|
||
|
+ndr_print_int3264: void (struct ndr_print *, const char *, int32_t)
|
||
|
+ndr_print_int8: void (struct ndr_print *, const char *, int8_t)
|
||
|
+ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *)
|
||
|
+ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID)
|
||
|
+ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType)
|
||
|
+ndr_print_null: void (struct ndr_print *)
|
||
|
+ndr_print_pointer: void (struct ndr_print *, const char *, void *)
|
||
|
+ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *)
|
||
|
+ndr_print_printf_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_ptr: void (struct ndr_print *, const char *, const void *)
|
||
|
+ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t)
|
||
|
+ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *)
|
||
|
+ndr_print_string: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_string_array: void (struct ndr_print *, const char *, const char **)
|
||
|
+ndr_print_string_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_struct: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_time_t: void (struct ndr_print *, const char *, time_t)
|
||
|
+ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *)
|
||
|
+ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *)
|
||
|
+ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t)
|
||
|
+ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t)
|
||
|
+ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t)
|
||
|
+ndr_print_union: void (struct ndr_print *, const char *, int, const char *)
|
||
|
+ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *)
|
||
|
+ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *)
|
||
|
+ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *)
|
||
|
+ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type)
|
||
|
+ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *)
|
||
|
+ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *)
|
||
|
+ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *)
|
||
|
+ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *)
|
||
|
+ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t)
|
||
|
+ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t)
|
||
|
+ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t)
|
||
|
+ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *)
|
||
|
+ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *)
|
||
|
+ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
|
||
|
+ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...)
|
||
|
+ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
|
||
|
+ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *)
|
||
|
+ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *)
|
||
|
+ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *)
|
||
|
+ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *)
|
||
|
+ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *)
|
||
|
+ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *)
|
||
|
+ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *)
|
||
|
+ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *)
|
||
|
+ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *)
|
||
|
+ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **)
|
||
|
+ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *)
|
||
|
+ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
|
||
|
+ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *)
|
||
|
+ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t)
|
||
|
+ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***)
|
||
|
+ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t)
|
||
|
+ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t)
|
||
|
+ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *)
|
||
|
+ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *)
|
||
|
+ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *)
|
||
|
+ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *)
|
||
|
+ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
|
||
|
+ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *)
|
||
|
+ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *)
|
||
|
+ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB)
|
||
|
+ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *)
|
||
|
+ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS)
|
||
|
+ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR)
|
||
|
+ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t)
|
||
|
+ndr_push_blob: DATA_BLOB (struct ndr_push *)
|
||
|
+ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t)
|
||
|
+ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t)
|
||
|
+ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double)
|
||
|
+ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
|
||
|
+ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...)
|
||
|
+ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t)
|
||
|
+ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *)
|
||
|
+ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *)
|
||
|
+ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t)
|
||
|
+ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *)
|
||
|
+ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t)
|
||
|
+ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t)
|
||
|
+ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t)
|
||
|
+ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *)
|
||
|
+ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID)
|
||
|
+ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType)
|
||
|
+ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *)
|
||
|
+ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *)
|
||
|
+ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *)
|
||
|
+ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t)
|
||
|
+ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
|
||
|
+ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
|
||
|
+ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **)
|
||
|
+ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t)
|
||
|
+ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t)
|
||
|
+ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t)
|
||
|
+ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t)
|
||
|
+ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *)
|
||
|
+ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *)
|
||
|
+ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t)
|
||
|
+ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
|
||
|
+ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t)
|
||
|
+ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *)
|
||
|
+ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type)
|
||
|
+ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t)
|
||
|
+ndr_set_flags: void (uint32_t *, uint32_t)
|
||
|
+ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int)
|
||
|
+ndr_size_GUID: size_t (const struct GUID *, int)
|
||
|
+ndr_size_string: uint32_t (int, const char * const *, int)
|
||
|
+ndr_size_string_array: size_t (const char **, uint32_t, int)
|
||
|
+ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t)
|
||
|
+ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t)
|
||
|
+ndr_string_array_size: size_t (struct ndr_push *, const char *)
|
||
|
+ndr_string_length: uint32_t (const void *, uint32_t)
|
||
|
+ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *)
|
||
|
+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
|
||
|
+ndr_token_peek: uint32_t (struct ndr_token_list **, const void *)
|
||
|
+ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *)
|
||
|
+ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool)
|
||
|
+ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t)
|
||
|
+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
|
||
|
+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
|
||
|
--- a/librpc/ndr/libndr.h
|
||
|
+++ b/librpc/ndr/libndr.h
|
||
|
@@ -124,6 +124,20 @@ struct ndr_print {
|
||
|
#define LIBNDR_FLAG_STR_UTF8 (1<<12)
|
||
|
#define LIBNDR_STRING_FLAGS (0x7FFC)
|
||
|
|
||
|
+/*
|
||
|
+ * don't debug NDR_ERR_BUFSIZE failures,
|
||
|
+ * as the available buffer might be incomplete.
|
||
|
+ *
|
||
|
+ * return NDR_ERR_INCOMPLETE_BUFFER instead.
|
||
|
+ */
|
||
|
+#define LIBNDR_FLAG_INCOMPLETE_BUFFER (1<<16)
|
||
|
+
|
||
|
+/*
|
||
|
+ * This lets ndr_pull_subcontext_end() return
|
||
|
+ * NDR_ERR_UNREAD_BYTES.
|
||
|
+ */
|
||
|
+#define LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES (1<<17)
|
||
|
+
|
||
|
/* set if relative pointers should *not* be marshalled in reverse order */
|
||
|
#define LIBNDR_FLAG_NO_RELATIVE_REVERSE (1<<18)
|
||
|
|
||
|
@@ -163,6 +177,7 @@ struct ndr_print {
|
||
|
|
||
|
/* useful macro for debugging */
|
||
|
#define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p)
|
||
|
+#define NDR_PRINT_DEBUGC(dbgc_class, type, p) ndr_print_debugc(dbgc_class, (ndr_print_fn_t)ndr_print_ ##type, #p, p)
|
||
|
#define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_fn_t)ndr_print_ ##type, #p, level, p)
|
||
|
#define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
|
||
|
#define NDR_PRINT_BOTH_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_BOTH, p)
|
||
|
@@ -199,7 +214,9 @@ enum ndr_err_code {
|
||
|
NDR_ERR_IPV6ADDRESS,
|
||
|
NDR_ERR_INVALID_POINTER,
|
||
|
NDR_ERR_UNREAD_BYTES,
|
||
|
- NDR_ERR_NDR64
|
||
|
+ NDR_ERR_NDR64,
|
||
|
+ NDR_ERR_FLAGS,
|
||
|
+ NDR_ERR_INCOMPLETE_BUFFER
|
||
|
};
|
||
|
|
||
|
#define NDR_ERR_CODE_IS_SUCCESS(x) (x == NDR_ERR_SUCCESS)
|
||
|
@@ -217,20 +234,52 @@ enum ndr_compression_alg {
|
||
|
|
||
|
/*
|
||
|
flags passed to control parse flow
|
||
|
+ These are deliberately in a different range to the NDR_IN/NDR_OUT
|
||
|
+ flags to catch mixups
|
||
|
*/
|
||
|
-#define NDR_SCALARS 1
|
||
|
-#define NDR_BUFFERS 2
|
||
|
+#define NDR_SCALARS 0x100
|
||
|
+#define NDR_BUFFERS 0x200
|
||
|
|
||
|
/*
|
||
|
- flags passed to ndr_print_*()
|
||
|
+ flags passed to ndr_print_*() and ndr pull/push for functions
|
||
|
+ These are deliberately in a different range to the NDR_SCALARS/NDR_BUFFERS
|
||
|
+ flags to catch mixups
|
||
|
*/
|
||
|
-#define NDR_IN 1
|
||
|
-#define NDR_OUT 2
|
||
|
-#define NDR_BOTH 3
|
||
|
-#define NDR_SET_VALUES 4
|
||
|
+#define NDR_IN 0x10
|
||
|
+#define NDR_OUT 0x20
|
||
|
+#define NDR_BOTH 0x30
|
||
|
+#define NDR_SET_VALUES 0x40
|
||
|
+
|
||
|
+
|
||
|
+#define NDR_PULL_CHECK_FLAGS(ndr, ndr_flags) do { \
|
||
|
+ if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) { \
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid pull struct ndr_flags 0x%x", ndr_flags); \
|
||
|
+ } \
|
||
|
+} while (0)
|
||
|
+
|
||
|
+#define NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags) do { \
|
||
|
+ if ((ndr_flags) & ~(NDR_SCALARS|NDR_BUFFERS)) \
|
||
|
+ return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid push struct ndr_flags 0x%x", ndr_flags); \
|
||
|
+} while (0)
|
||
|
+
|
||
|
+#define NDR_PULL_CHECK_FN_FLAGS(ndr, flags) do { \
|
||
|
+ if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) { \
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_FLAGS, "Invalid fn pull flags 0x%x", flags); \
|
||
|
+ } \
|
||
|
+} while (0)
|
||
|
+
|
||
|
+#define NDR_PUSH_CHECK_FN_FLAGS(ndr, flags) do { \
|
||
|
+ if ((flags) & ~(NDR_BOTH|NDR_SET_VALUES)) \
|
||
|
+ return ndr_push_error(ndr, NDR_ERR_FLAGS, "Invalid fn push flags 0x%x", flags); \
|
||
|
+} while (0)
|
||
|
|
||
|
#define NDR_PULL_NEED_BYTES(ndr, n) do { \
|
||
|
if (unlikely((n) > ndr->data_size || ndr->offset + (n) > ndr->data_size)) { \
|
||
|
+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \
|
||
|
+ uint32_t _available = ndr->data_size - ndr->offset; \
|
||
|
+ uint32_t _missing = n - _available; \
|
||
|
+ ndr->relative_highest_offset = _missing; \
|
||
|
+ } \
|
||
|
return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull bytes %u (%s)", (unsigned)n, __location__); \
|
||
|
} \
|
||
|
} while(0)
|
||
|
@@ -247,6 +296,10 @@ enum ndr_compression_alg {
|
||
|
ndr->offset = (ndr->offset + (n-1)) & ~(n-1); \
|
||
|
} \
|
||
|
if (unlikely(ndr->offset > ndr->data_size)) { \
|
||
|
+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) { \
|
||
|
+ uint32_t _missing = ndr->offset - ndr->data_size; \
|
||
|
+ ndr->relative_highest_offset = _missing; \
|
||
|
+ } \
|
||
|
return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "Pull align %u", (unsigned)n); \
|
||
|
} \
|
||
|
} while(0)
|
||
|
@@ -402,6 +455,8 @@ void ndr_print_dom_sid0(struct ndr_print
|
||
|
size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags);
|
||
|
void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid);
|
||
|
bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2);
|
||
|
+char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id);
|
||
|
+bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id);
|
||
|
enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, const void *p, ndr_push_flags_fn_t fn);
|
||
|
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);
|
||
|
size_t ndr_size_struct(const void *p, int flags, ndr_push_flags_fn_t push);
|
||
|
@@ -424,14 +479,18 @@ enum ndr_err_code ndr_pull_relative_ptr2
|
||
|
enum ndr_err_code ndr_pull_relative_ptr_short(struct ndr_pull *ndr, uint16_t *v);
|
||
|
size_t ndr_align_size(uint32_t offset, size_t n);
|
||
|
struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx);
|
||
|
+enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob);
|
||
|
+enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr);
|
||
|
enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size);
|
||
|
struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx);
|
||
|
DATA_BLOB ndr_push_blob(struct ndr_push *ndr);
|
||
|
enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size);
|
||
|
void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||
|
+void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||
|
void ndr_print_printf_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||
|
void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
|
||
|
void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr);
|
||
|
+void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr);
|
||
|
void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr);
|
||
|
void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr);
|
||
|
char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr);
|
||
|
--- a/librpc/ndr/ndr.c
|
||
|
+++ b/librpc/ndr/ndr.c
|
||
|
@@ -77,6 +77,111 @@ _PUBLIC_ struct ndr_pull *ndr_pull_init_
|
||
|
return ndr;
|
||
|
}
|
||
|
|
||
|
+_PUBLIC_ enum ndr_err_code ndr_pull_append(struct ndr_pull *ndr, DATA_BLOB *blob)
|
||
|
+{
|
||
|
+ enum ndr_err_code ndr_err;
|
||
|
+ DATA_BLOB b;
|
||
|
+ uint32_t append = 0;
|
||
|
+ bool ok;
|
||
|
+
|
||
|
+ if (blob->length == 0) {
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr_err = ndr_token_retrieve(&ndr->array_size_list, ndr, &append);
|
||
|
+ if (ndr_err == NDR_ERR_TOKEN) {
|
||
|
+ append = 0;
|
||
|
+ ndr_err = NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+ NDR_CHECK(ndr_err);
|
||
|
+
|
||
|
+ if (ndr->data_size == 0) {
|
||
|
+ ndr->data = NULL;
|
||
|
+ append = UINT32_MAX;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (append == UINT32_MAX) {
|
||
|
+ /*
|
||
|
+ * append == UINT32_MAX means that
|
||
|
+ * ndr->data is either NULL or a valid
|
||
|
+ * talloc child of ndr, which means
|
||
|
+ * we can use data_blob_append() without
|
||
|
+ * data_blob_talloc() of the existing callers data
|
||
|
+ */
|
||
|
+ b = data_blob_const(ndr->data, ndr->data_size);
|
||
|
+ } else {
|
||
|
+ b = data_blob_talloc(ndr, ndr->data, ndr->data_size);
|
||
|
+ if (b.data == NULL) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ ok = data_blob_append(ndr, &b, blob->data, blob->length);
|
||
|
+ if (!ok) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr->data = b.data;
|
||
|
+ ndr->data_size = b.length;
|
||
|
+
|
||
|
+ return ndr_token_store(ndr, &ndr->array_size_list, ndr, UINT32_MAX);
|
||
|
+}
|
||
|
+
|
||
|
+_PUBLIC_ enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr)
|
||
|
+{
|
||
|
+ uint32_t skip = 0;
|
||
|
+ uint32_t append = 0;
|
||
|
+
|
||
|
+ if (ndr->relative_base_offset != 0) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
|
||
|
+ "%s", __location__);
|
||
|
+ }
|
||
|
+ if (ndr->relative_highest_offset != 0) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
|
||
|
+ "%s", __location__);
|
||
|
+ }
|
||
|
+ if (ndr->relative_list != NULL) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
|
||
|
+ "%s", __location__);
|
||
|
+ }
|
||
|
+ if (ndr->relative_base_list != NULL) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_RELATIVE,
|
||
|
+ "%s", __location__);
|
||
|
+ }
|
||
|
+
|
||
|
+ /*
|
||
|
+ * we need to keep up to 7 bytes
|
||
|
+ * in order to get the aligment right.
|
||
|
+ */
|
||
|
+ skip = ndr->offset & 0xFFFFFFF8;
|
||
|
+
|
||
|
+ if (skip == 0) {
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr->offset -= skip;
|
||
|
+ ndr->data_size -= skip;
|
||
|
+
|
||
|
+ append = ndr_token_peek(&ndr->array_size_list, ndr);
|
||
|
+ if (append != UINT32_MAX) {
|
||
|
+ /*
|
||
|
+ * here we assume, that ndr->data is not a
|
||
|
+ * talloc child of ndr.
|
||
|
+ */
|
||
|
+ ndr->data += skip;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ memmove(ndr->data, ndr->data + skip, ndr->data_size);
|
||
|
+
|
||
|
+ ndr->data = talloc_realloc(ndr, ndr->data, uint8_t, ndr->data_size);
|
||
|
+ if (ndr->data_size != 0 && ndr->data == NULL) {
|
||
|
+ return ndr_pull_error(ndr, NDR_ERR_ALLOC, "%s", __location__);
|
||
|
+ }
|
||
|
+
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+}
|
||
|
+
|
||
|
/*
|
||
|
advance by 'size' bytes
|
||
|
*/
|
||
|
@@ -167,6 +272,38 @@ _PUBLIC_ enum ndr_err_code ndr_push_expa
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
+_PUBLIC_ void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, ...)
|
||
|
+{
|
||
|
+ va_list ap;
|
||
|
+ char *s = NULL;
|
||
|
+ uint32_t i;
|
||
|
+ int ret;
|
||
|
+ int dbgc_class;
|
||
|
+
|
||
|
+ va_start(ap, format);
|
||
|
+ ret = vasprintf(&s, format, ap);
|
||
|
+ va_end(ap);
|
||
|
+
|
||
|
+ if (ret == -1) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ dbgc_class = *(int *)ndr->private_data;
|
||
|
+
|
||
|
+ if (ndr->no_newline) {
|
||
|
+ DEBUGADDC(dbgc_class, 1,("%s", s));
|
||
|
+ free(s);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (i=0;i<ndr->depth;i++) {
|
||
|
+ DEBUGADDC(dbgc_class, 1,(" "));
|
||
|
+ }
|
||
|
+
|
||
|
+ DEBUGADDC(dbgc_class, 1,("%s\n", s));
|
||
|
+ free(s);
|
||
|
+}
|
||
|
+
|
||
|
_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...)
|
||
|
{
|
||
|
va_list ap;
|
||
|
@@ -238,6 +375,25 @@ _PUBLIC_ void ndr_print_string_helper(st
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
+ a useful helper function for printing idl structures via DEBUGC()
|
||
|
+*/
|
||
|
+_PUBLIC_ void ndr_print_debugc(int dbgc_class, ndr_print_fn_t fn, const char *name, void *ptr)
|
||
|
+{
|
||
|
+ struct ndr_print *ndr;
|
||
|
+
|
||
|
+ DEBUGC(dbgc_class, 1,(" "));
|
||
|
+
|
||
|
+ ndr = talloc_zero(NULL, struct ndr_print);
|
||
|
+ if (!ndr) return;
|
||
|
+ ndr->private_data = &dbgc_class;
|
||
|
+ ndr->print = ndr_print_debugc_helper;
|
||
|
+ ndr->depth = 1;
|
||
|
+ ndr->flags = 0;
|
||
|
+ fn(ndr, name, ptr);
|
||
|
+ talloc_free(ndr);
|
||
|
+}
|
||
|
+
|
||
|
+/*
|
||
|
a useful helper function for printing idl structures via DEBUG()
|
||
|
*/
|
||
|
_PUBLIC_ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr)
|
||
|
@@ -403,6 +559,15 @@ _PUBLIC_ enum ndr_err_code ndr_pull_erro
|
||
|
va_list ap;
|
||
|
int ret;
|
||
|
|
||
|
+ if (ndr->flags & LIBNDR_FLAG_INCOMPLETE_BUFFER) {
|
||
|
+ switch (ndr_err) {
|
||
|
+ case NDR_ERR_BUFSIZE:
|
||
|
+ return NDR_ERR_INCOMPLETE_BUFFER;
|
||
|
+ default:
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
va_start(ap, format);
|
||
|
ret = vasprintf(&s, format, ap);
|
||
|
va_end(ap);
|
||
|
@@ -557,6 +722,23 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc
|
||
|
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &reserved));
|
||
|
break;
|
||
|
}
|
||
|
+ case 0xFFFFFFFF:
|
||
|
+ /*
|
||
|
+ * a shallow copy like subcontext
|
||
|
+ * useful for DCERPC pipe chunks.
|
||
|
+ */
|
||
|
+ subndr = talloc_zero(ndr, struct ndr_pull);
|
||
|
+ NDR_ERR_HAVE_NO_MEMORY(subndr);
|
||
|
+
|
||
|
+ subndr->flags = ndr->flags;
|
||
|
+ subndr->current_mem_ctx = ndr->current_mem_ctx;
|
||
|
+ subndr->data = ndr->data;
|
||
|
+ subndr->offset = ndr->offset;
|
||
|
+ subndr->data_size = ndr->data_size;
|
||
|
+
|
||
|
+ *_subndr = subndr;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+
|
||
|
default:
|
||
|
return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d",
|
||
|
(int)header_size);
|
||
|
@@ -589,13 +771,35 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subc
|
||
|
ssize_t size_is)
|
||
|
{
|
||
|
uint32_t advance;
|
||
|
- if (size_is >= 0) {
|
||
|
+ uint32_t highest_ofs;
|
||
|
+
|
||
|
+ if (header_size == 0xFFFFFFFF) {
|
||
|
+ advance = subndr->offset - ndr->offset;
|
||
|
+ } else if (size_is >= 0) {
|
||
|
advance = size_is;
|
||
|
} else if (header_size > 0) {
|
||
|
advance = subndr->data_size;
|
||
|
} else {
|
||
|
advance = subndr->offset;
|
||
|
}
|
||
|
+
|
||
|
+ if (subndr->offset > ndr->relative_highest_offset) {
|
||
|
+ highest_ofs = subndr->offset;
|
||
|
+ } else {
|
||
|
+ highest_ofs = subndr->relative_highest_offset;
|
||
|
+ }
|
||
|
+ if (!(subndr->flags & LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES)) {
|
||
|
+ /*
|
||
|
+ * avoid an error unless SUBCONTEXT_NO_UNREAD_BYTES is specified
|
||
|
+ */
|
||
|
+ highest_ofs = advance;
|
||
|
+ }
|
||
|
+ if (highest_ofs < advance) {
|
||
|
+ return ndr_pull_error(subndr, NDR_ERR_UNREAD_BYTES,
|
||
|
+ "not all bytes consumed ofs[%u] advance[%u]",
|
||
|
+ highest_ofs, advance);
|
||
|
+ }
|
||
|
+
|
||
|
NDR_CHECK(ndr_pull_advance(ndr, advance));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -1440,6 +1644,7 @@ const static struct {
|
||
|
{ NDR_ERR_INVALID_POINTER, "Invalid Pointer" },
|
||
|
{ NDR_ERR_UNREAD_BYTES, "Unread Bytes" },
|
||
|
{ NDR_ERR_NDR64, "NDR64 assertion error" },
|
||
|
+ { NDR_ERR_INCOMPLETE_BUFFER, "Incomplete Buffer" },
|
||
|
{ 0, NULL }
|
||
|
};
|
||
|
|
||
|
--- a/librpc/idl/idl_types.h
|
||
|
+++ b/librpc/idl/idl_types.h
|
||
|
@@ -47,3 +47,5 @@
|
||
|
|
||
|
#define NDR_RELATIVE_REVERSE LIBNDR_FLAG_RELATIVE_REVERSE
|
||
|
#define NDR_NO_RELATIVE_REVERSE LIBNDR_FLAG_NO_RELATIVE_REVERSE
|
||
|
+
|
||
|
+#define NDR_SUBCONTEXT_NO_UNREAD_BYTES LIBNDR_FLAG_SUBCONTEXT_NO_UNREAD_BYTES
|
||
|
--- a/librpc/idl/dcerpc.idl
|
||
|
+++ b/librpc/idl/dcerpc.idl
|
||
|
@@ -10,6 +10,8 @@
|
||
|
*/
|
||
|
import "misc.idl";
|
||
|
|
||
|
+cpp_quote("extern const uint8_t DCERPC_SEC_VT_MAGIC[8];")
|
||
|
+
|
||
|
interface dcerpc
|
||
|
{
|
||
|
typedef struct {
|
||
|
@@ -453,14 +455,21 @@ interface dcerpc
|
||
|
} dcerpc_payload;
|
||
|
|
||
|
/* pfc_flags values */
|
||
|
- const uint8 DCERPC_PFC_FLAG_FIRST = 0x01; /* First fragment */
|
||
|
- const uint8 DCERPC_PFC_FLAG_LAST = 0x02; /* Last fragment */
|
||
|
- const uint8 DCERPC_PFC_FLAG_PENDING_CANCEL = 0x04; /* Cancel was pending at sender */
|
||
|
- const uint8 DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN = DCERPC_PFC_FLAG_PENDING_CANCEL; /* depends on the pdu type */
|
||
|
- const uint8 DCERPC_PFC_FLAG_CONC_MPX = 0x10; /* supports concurrent multiplexing of a single connection. */
|
||
|
- const uint8 DCERPC_PFC_FLAG_DID_NOT_EXECUTE = 0x20; /* on a fault it means the server hasn't done anything */
|
||
|
- const uint8 DCERPC_PFC_FLAG_MAYBE = 0x40; /* `maybe' call semantics requested */
|
||
|
- const uint8 DCERPC_PFC_FLAG_OBJECT_UUID = 0x80; /* on valid guid is in the optional object field */
|
||
|
+ typedef [bitmap8bit] bitmap {
|
||
|
+ DCERPC_PFC_FLAG_FIRST = 0x01, /* First fragment */
|
||
|
+ DCERPC_PFC_FLAG_LAST = 0x02, /* Last fragment */
|
||
|
+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING = 0x04, /* depends on the pdu type */
|
||
|
+ DCERPC_PFC_FLAG_CONC_MPX = 0x10, /* supports concurrent multiplexing of a single connection. */
|
||
|
+ DCERPC_PFC_FLAG_DID_NOT_EXECUTE = 0x20, /* on a fault it means the server hasn't done anything */
|
||
|
+ DCERPC_PFC_FLAG_MAYBE = 0x40, /* `maybe' call semantics requested */
|
||
|
+ DCERPC_PFC_FLAG_OBJECT_UUID = 0x80 /* on valid guid is in the optional object field */
|
||
|
+ } dcerpc_pfc_flags;
|
||
|
+
|
||
|
+ /* Cancel was pending at sender */
|
||
|
+ const int DCERPC_PFC_FLAG_PENDING_CANCEL =
|
||
|
+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
|
||
|
+ const ist DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN =
|
||
|
+ DCERPC_PFC_FLAG_PENDING_CANCEL_OR_HDR_SIGNING;
|
||
|
|
||
|
/* these offsets are needed by the signing code */
|
||
|
const uint8 DCERPC_PFC_OFFSET = 3;
|
||
|
@@ -468,6 +477,7 @@ interface dcerpc
|
||
|
const uint8 DCERPC_FRAG_LEN_OFFSET = 8;
|
||
|
const uint8 DCERPC_AUTH_LEN_OFFSET = 10;
|
||
|
const uint8 DCERPC_CALL_ID_OFFSET = 12;
|
||
|
+ const uint8 DCERPC_NCACN_PAYLOAD_OFFSET = 16;
|
||
|
|
||
|
/* little-endian flag */
|
||
|
const uint8 DCERPC_DREP_LE = 0x10;
|
||
|
@@ -476,7 +486,7 @@ interface dcerpc
|
||
|
uint8 rpc_vers; /* RPC version */
|
||
|
uint8 rpc_vers_minor; /* Minor version */
|
||
|
dcerpc_pkt_type ptype; /* Packet type */
|
||
|
- uint8 pfc_flags; /* Fragmentation flags */
|
||
|
+ dcerpc_pfc_flags pfc_flags; /* Fragmentation flags */
|
||
|
uint8 drep[4]; /* NDR data representation */
|
||
|
uint16 frag_length; /* Total length of fragment */
|
||
|
uint16 auth_length; /* authenticator length */
|
||
|
@@ -506,4 +516,69 @@ interface dcerpc
|
||
|
uint8 serial_low;
|
||
|
[switch_is(ptype)] dcerpc_payload u;
|
||
|
} ncadg_packet;
|
||
|
+
|
||
|
+ typedef [bitmap16bit] bitmap {
|
||
|
+ DCERPC_SEC_VT_COMMAND_ENUM = 0x3FFF,
|
||
|
+ DCERPC_SEC_VT_COMMAND_END = 0x4000,
|
||
|
+ DCERPC_SEC_VT_MUST_PROCESS = 0x8000
|
||
|
+ } dcerpc_sec_vt_command;
|
||
|
+
|
||
|
+ typedef [enum16bit] enum {
|
||
|
+ DCERPC_SEC_VT_COMMAND_BITMASK1 = 0x0001,
|
||
|
+ DCERPC_SEC_VT_COMMAND_PCONTEXT = 0x0002,
|
||
|
+ DCERPC_SEC_VT_COMMAND_HEADER2 = 0x0003
|
||
|
+ } dcerpc_sec_vt_command_enum;
|
||
|
+
|
||
|
+ typedef [bitmap32bit] bitmap {
|
||
|
+ DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING = 0x00000001
|
||
|
+ } dcerpc_sec_vt_bitmask1;
|
||
|
+
|
||
|
+ typedef struct {
|
||
|
+ ndr_syntax_id abstract_syntax;
|
||
|
+ ndr_syntax_id transfer_syntax;
|
||
|
+ } dcerpc_sec_vt_pcontext;
|
||
|
+
|
||
|
+ typedef struct {
|
||
|
+ dcerpc_pkt_type ptype; /* Packet type */
|
||
|
+ [value(0)] uint8 reserved1;
|
||
|
+ [value(0)] uint16 reserved2;
|
||
|
+ uint8 drep[4]; /* NDR data representation */
|
||
|
+ uint32 call_id; /* Call identifier */
|
||
|
+ uint16 context_id;
|
||
|
+ uint16 opnum;
|
||
|
+ } dcerpc_sec_vt_header2;
|
||
|
+
|
||
|
+ typedef [switch_type(dcerpc_sec_vt_command_enum),nodiscriminant] union {
|
||
|
+ [case(DCERPC_SEC_VT_COMMAND_BITMASK1)] dcerpc_sec_vt_bitmask1 bitmask1;
|
||
|
+ [case(DCERPC_SEC_VT_COMMAND_PCONTEXT)] dcerpc_sec_vt_pcontext pcontext;
|
||
|
+ [case(DCERPC_SEC_VT_COMMAND_HEADER2)] dcerpc_sec_vt_header2 header2;
|
||
|
+ [default,flag(NDR_REMAINING)] DATA_BLOB _unknown;
|
||
|
+ } dcerpc_sec_vt_union;
|
||
|
+
|
||
|
+ typedef struct {
|
||
|
+ dcerpc_sec_vt_command command;
|
||
|
+ [switch_is(command & DCERPC_SEC_VT_COMMAND_ENUM)]
|
||
|
+ [subcontext(2),flag(NDR_SUBCONTEXT_NO_UNREAD_BYTES)]
|
||
|
+ dcerpc_sec_vt_union u;
|
||
|
+ } dcerpc_sec_vt;
|
||
|
+
|
||
|
+ typedef [public,nopush,nopull] struct {
|
||
|
+ uint16 count;
|
||
|
+ } dcerpc_sec_vt_count;
|
||
|
+
|
||
|
+ /*
|
||
|
+ * We assume that the whole verification trailer fits into
|
||
|
+ * the last 1024 bytes after the stub data.
|
||
|
+ *
|
||
|
+ * There're currently only 3 commands defined and each should
|
||
|
+ * only be used once.
|
||
|
+ */
|
||
|
+ const uint16 DCERPC_SEC_VT_MAX_SIZE = 1024;
|
||
|
+
|
||
|
+ typedef [public,flag(NDR_PAHEX)] struct {
|
||
|
+ [flag(NDR_ALIGN4)] DATA_BLOB _pad;
|
||
|
+ [value(DCERPC_SEC_VT_MAGIC)] uint8 magic[8];
|
||
|
+ dcerpc_sec_vt_count count;
|
||
|
+ dcerpc_sec_vt commands[count.count];
|
||
|
+ } dcerpc_sec_verification_trailer;
|
||
|
}
|
||
|
--- /dev/null
|
||
|
+++ b/librpc/ndr/ndr_dcerpc.c
|
||
|
@@ -0,0 +1,187 @@
|
||
|
+/*
|
||
|
+ Unix SMB/CIFS implementation.
|
||
|
+
|
||
|
+ Manually parsed structures found in the DCERPC protocol
|
||
|
+
|
||
|
+ Copyright (C) Stefan Metzmacher 2014
|
||
|
+ Copyright (C) Gregor Beck 2014
|
||
|
+
|
||
|
+ This program is free software; you can redistribute it and/or modify
|
||
|
+ it under the terms of the GNU General Public License as published by
|
||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||
|
+ (at your option) any later version.
|
||
|
+
|
||
|
+ This program is distributed in the hope that it will be useful,
|
||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+ GNU General Public License for more details.
|
||
|
+
|
||
|
+ You should have received a copy of the GNU General Public License
|
||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
+*/
|
||
|
+
|
||
|
+#include "includes.h"
|
||
|
+#include "librpc/gen_ndr/ndr_dcerpc.h"
|
||
|
+
|
||
|
+#include "librpc/gen_ndr/ndr_misc.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
+
|
||
|
+const uint8_t DCERPC_SEC_VT_MAGIC[] = {0x8a,0xe3,0x13,0x71,0x02,0xf4,0x36,0x71};
|
||
|
+
|
||
|
+_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)
|
||
|
+{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
+ /* nothing */
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+}
|
||
|
+
|
||
|
+_PUBLIC_ enum ndr_err_code ndr_pull_dcerpc_sec_vt_count(struct ndr_pull *ndr, int ndr_flags, struct dcerpc_sec_vt_count *r)
|
||
|
+{
|
||
|
+ uint32_t _saved_ofs = ndr->offset;
|
||
|
+
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
+
|
||
|
+ if (!(ndr_flags & NDR_SCALARS)) {
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ r->count = 0;
|
||
|
+
|
||
|
+ while (true) {
|
||
|
+ uint16_t command;
|
||
|
+ uint16_t length;
|
||
|
+
|
||
|
+ NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &command));
|
||
|
+ NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &length));
|
||
|
+ NDR_CHECK(ndr_pull_advance(ndr, length));
|
||
|
+
|
||
|
+ r->count += 1;
|
||
|
+
|
||
|
+ if (command & DCERPC_SEC_VT_COMMAND_END) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr->offset = _saved_ofs;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+}
|
||
|
+
|
||
|
+_PUBLIC_ enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer(
|
||
|
+ struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
|
||
|
+ struct dcerpc_sec_verification_trailer **_r)
|
||
|
+{
|
||
|
+ enum ndr_err_code ndr_err;
|
||
|
+ uint32_t ofs;
|
||
|
+ uint32_t min_ofs = 0;
|
||
|
+ struct dcerpc_sec_verification_trailer *r;
|
||
|
+ DATA_BLOB sub_blob = data_blob_null;
|
||
|
+ struct ndr_pull *sub_ndr = NULL;
|
||
|
+ uint32_t remaining;
|
||
|
+
|
||
|
+ *_r = NULL;
|
||
|
+
|
||
|
+ r = talloc_zero(mem_ctx, struct dcerpc_sec_verification_trailer);
|
||
|
+ if (r == NULL) {
|
||
|
+ return NDR_ERR_ALLOC;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (ndr->data_size < sizeof(DCERPC_SEC_VT_MAGIC)) {
|
||
|
+ /*
|
||
|
+ * we return with r->count = 0
|
||
|
+ */
|
||
|
+ *_r = r;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ ofs = ndr->data_size - sizeof(DCERPC_SEC_VT_MAGIC);
|
||
|
+ /* the magic is 4 byte aligned */
|
||
|
+ ofs &= ~3;
|
||
|
+
|
||
|
+ if (ofs > DCERPC_SEC_VT_MAX_SIZE) {
|
||
|
+ /*
|
||
|
+ * We just scan the last 1024 bytes.
|
||
|
+ */
|
||
|
+ min_ofs = ofs - DCERPC_SEC_VT_MAX_SIZE;
|
||
|
+ } else {
|
||
|
+ min_ofs = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ while (true) {
|
||
|
+ int ret;
|
||
|
+
|
||
|
+ ret = memcmp(&ndr->data[ofs],
|
||
|
+ DCERPC_SEC_VT_MAGIC,
|
||
|
+ sizeof(DCERPC_SEC_VT_MAGIC));
|
||
|
+ if (ret == 0) {
|
||
|
+ sub_blob = data_blob_const(&ndr->data[ofs],
|
||
|
+ ndr->data_size - ofs);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (ofs <= min_ofs) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ ofs -= 4;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (sub_blob.length == 0) {
|
||
|
+ /*
|
||
|
+ * we return with r->count = 0
|
||
|
+ */
|
||
|
+ *_r = r;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ sub_ndr = ndr_pull_init_blob(&sub_blob, r);
|
||
|
+ if (sub_ndr == NULL) {
|
||
|
+ TALLOC_FREE(r);
|
||
|
+ return NDR_ERR_ALLOC;
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr_err = ndr_pull_dcerpc_sec_verification_trailer(sub_ndr,
|
||
|
+ NDR_SCALARS | NDR_BUFFERS,
|
||
|
+ r);
|
||
|
+ if (ndr_err == NDR_ERR_ALLOC) {
|
||
|
+ TALLOC_FREE(r);
|
||
|
+ return NDR_ERR_ALLOC;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
|
||
|
+ goto ignore_error;
|
||
|
+ }
|
||
|
+
|
||
|
+ remaining = sub_ndr->data_size - sub_ndr->offset;
|
||
|
+ if (remaining > 16) {
|
||
|
+ /*
|
||
|
+ * we expect not more than 16 byte of additional
|
||
|
+ * padding after the verification trailer.
|
||
|
+ */
|
||
|
+ goto ignore_error;
|
||
|
+ }
|
||
|
+
|
||
|
+ /*
|
||
|
+ * We assume that we got a real verification trailer.
|
||
|
+ *
|
||
|
+ * We remove it from the available stub data.
|
||
|
+ */
|
||
|
+ ndr->data_size = ofs;
|
||
|
+
|
||
|
+ TALLOC_FREE(sub_ndr);
|
||
|
+
|
||
|
+ *_r = r;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+
|
||
|
+ignore_error:
|
||
|
+ TALLOC_FREE(sub_ndr);
|
||
|
+ /*
|
||
|
+ * just ignore the error, it's likely
|
||
|
+ * that the magic we found belongs to
|
||
|
+ * the stub data.
|
||
|
+ *
|
||
|
+ * we return with r->count = 0
|
||
|
+ */
|
||
|
+ ZERO_STRUCTP(r);
|
||
|
+ *_r = r;
|
||
|
+ return NDR_ERR_SUCCESS;
|
||
|
+}
|
||
|
--- a/librpc/wscript_build
|
||
|
+++ b/librpc/wscript_build
|
||
|
@@ -274,8 +274,9 @@ bld.SAMBA_SUBSYSTEM('NDR_COMPRESSION',
|
||
|
)
|
||
|
|
||
|
bld.SAMBA_SUBSYSTEM('NDR_DCERPC',
|
||
|
- source='gen_ndr/ndr_dcerpc.c',
|
||
|
+ source='gen_ndr/ndr_dcerpc.c ndr/ndr_dcerpc.c',
|
||
|
public_deps='ndr',
|
||
|
+ deps='bitmap',
|
||
|
public_headers='gen_ndr/ndr_dcerpc.h gen_ndr/dcerpc.h',
|
||
|
header_path= [ ('*gen_ndr*', 'gen_ndr') ],
|
||
|
)
|
||
|
--- a/source3/Makefile.in
|
||
|
+++ b/source3/Makefile.in
|
||
|
@@ -323,7 +323,8 @@ LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \
|
||
|
../librpc/ndr/uuid.o \
|
||
|
librpc/ndr/util.o \
|
||
|
librpc/gen_ndr/ndr_server_id.o \
|
||
|
- librpc/gen_ndr/ndr_dcerpc.o
|
||
|
+ librpc/gen_ndr/ndr_dcerpc.o \
|
||
|
+ ../librpc/ndr/ndr_dcerpc.o
|
||
|
|
||
|
LIBNDR_GEN_OBJ0 = librpc/gen_ndr/ndr_samr.o \
|
||
|
librpc/gen_ndr/ndr_lsa.o
|
||
|
@@ -454,7 +455,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ
|
||
|
lib/username.o \
|
||
|
../libds/common/flag_mapping.o \
|
||
|
lib/access.o lib/smbrun.o \
|
||
|
- lib/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \
|
||
|
+ ../lib/util/bitmap.o lib/dprintf.o $(UTIL_REG_OBJ) \
|
||
|
lib/wins_srv.o \
|
||
|
lib/util_str.o lib/clobber.o lib/util_sid.o \
|
||
|
lib/util_unistr.o ../lib/util/charset/codepoints.o lib/util_file.o \
|
||
|
@@ -987,7 +988,9 @@ SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(P
|
||
|
$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \
|
||
|
$(PASSCHANGE_OBJ) $(FNAME_UTIL_OBJ) \
|
||
|
$(LIBCLI_SAMR_OBJ) \
|
||
|
- rpc_client/init_lsa.o
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_lsa.o \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
STATUS_OBJ = utils/status.o utils/status_profile.o \
|
||
|
$(LOCKING_OBJ) $(PARAM_OBJ) \
|
||
|
@@ -1003,7 +1006,9 @@ SMBTREE_OBJ = utils/smbtree.o $(PARAM_OB
|
||
|
$(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
|
||
|
$(LIBMSRPC_GEN_OBJ) \
|
||
|
$(LIBMSRPC_OBJ) \
|
||
|
- $(LIBCLI_SRVSVC_OBJ)
|
||
|
+ $(LIBCLI_SRVSVC_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
TESTPARM_OBJ = utils/testparm.o \
|
||
|
$(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
|
||
|
@@ -1025,7 +1030,9 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASS
|
||
|
$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \
|
||
|
$(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \
|
||
|
$(LIBCLI_SAMR_OBJ) \
|
||
|
- rpc_client/init_lsa.o
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_lsa.o \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \
|
||
|
$(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \
|
||
|
@@ -1098,7 +1105,9 @@ LIBSMBCLIENT_OBJ1 = $(LIBSMBCLIENT_OBJ0)
|
||
|
$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
|
||
|
$(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
|
||
|
$(LIBCLI_SRVSVC_OBJ) \
|
||
|
- $(LIBCLI_LSA_OBJ)
|
||
|
+ $(LIBCLI_LSA_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
LIBSMBCLIENT_OBJ = $(LIBSMBCLIENT_OBJ1)
|
||
|
|
||
|
@@ -1121,7 +1130,9 @@ CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ)
|
||
|
$(READLINE_OBJ) $(POPT_LIB_OBJ) \
|
||
|
$(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
|
||
|
$(DISPLAY_SEC_OBJ) \
|
||
|
- $(LIBCLI_SRVSVC_OBJ)
|
||
|
+ $(LIBCLI_SRVSVC_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
LIBSMBCONF_OBJ = ../lib/smbconf/smbconf.o \
|
||
|
../lib/smbconf/smbconf_util.o \
|
||
|
@@ -1233,7 +1244,9 @@ SMBTORTURE_OBJ = $(SMBTORTURE_OBJ1) $(PA
|
||
|
@LIBWBCLIENT_STATIC@ \
|
||
|
torture/wbc_async.o \
|
||
|
../nsswitch/wb_reqtrans.o \
|
||
|
- $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ)
|
||
|
+ $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBCLI_ECHO_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) rpc_client/init_netlogon.o
|
||
|
+
|
||
|
|
||
|
MASKTEST_OBJ = torture/masktest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
|
||
|
$(LIB_NONSMBD_OBJ) \
|
||
|
@@ -1268,14 +1281,18 @@ SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_
|
||
|
$(KRBCLIENT_OBJ) $(LIB_NONSMBD_OBJ) \
|
||
|
$(PASSDB_OBJ) $(GROUPDB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
|
||
|
$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) \
|
||
|
- $(LIBCLI_LSA_OBJ)
|
||
|
+ $(LIBCLI_LSA_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
|
||
|
$(PARAM_OBJ) \
|
||
|
$(LIB_NONSMBD_OBJ) \
|
||
|
$(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(POPT_LIB_OBJ) \
|
||
|
$(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) \
|
||
|
- $(LIBCLI_LSA_OBJ)
|
||
|
+ $(LIBCLI_LSA_OBJ) \
|
||
|
+ $(LIBCLI_NETLOGON_OBJ) \
|
||
|
+ rpc_client/init_netlogon.o
|
||
|
|
||
|
EVTLOGADM_OBJ0 = utils/eventlogadm.o
|
||
|
|
||
|
--- a/librpc/ndr/ndr_basic.c
|
||
|
+++ b/librpc/ndr/ndr_basic.c
|
||
|
@@ -61,6 +61,7 @@ _PUBLIC_ void ndr_check_padding(struct n
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_int8(struct ndr_pull *ndr, int ndr_flags, int8_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 1);
|
||
|
*v = (int8_t)CVAL(ndr->data, ndr->offset);
|
||
|
ndr->offset += 1;
|
||
|
@@ -72,6 +73,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int8
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 1);
|
||
|
*v = CVAL(ndr->data, ndr->offset);
|
||
|
ndr->offset += 1;
|
||
|
@@ -83,6 +85,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_int16(struct ndr_pull *ndr, int ndr_flags, int16_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 2);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 2);
|
||
|
*v = (uint16_t)NDR_SVAL(ndr, ndr->offset);
|
||
|
@@ -95,6 +98,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int1
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_uint16(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 2);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 2);
|
||
|
*v = NDR_SVAL(ndr, ndr->offset);
|
||
|
@@ -107,6 +111,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_uint1632(struct ndr_pull *ndr, int ndr_flags, uint16_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
if (unlikely(ndr->flags & LIBNDR_FLAG_NDR64)) {
|
||
|
uint32_t v32 = 0;
|
||
|
enum ndr_err_code err = ndr_pull_uint32(ndr, ndr_flags, &v32);
|
||
|
@@ -125,6 +130,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_int32(struct ndr_pull *ndr, int ndr_flags, int32_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 4);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 4);
|
||
|
*v = NDR_IVALS(ndr, ndr->offset);
|
||
|
@@ -137,6 +143,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_int3
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_uint32(struct ndr_pull *ndr, int ndr_flags, uint32_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 4);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 4);
|
||
|
*v = NDR_IVAL(ndr, ndr->offset);
|
||
|
@@ -151,6 +158,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
|
||
|
{
|
||
|
uint64_t v64;
|
||
|
enum ndr_err_code err;
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
if (likely(!(ndr->flags & LIBNDR_FLAG_NDR64))) {
|
||
|
return ndr_pull_uint32(ndr, ndr_flags, v);
|
||
|
}
|
||
|
@@ -169,6 +177,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_double(struct ndr_pull *ndr, int ndr_flags, double *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 8);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 8);
|
||
|
memcpy(v, ndr->data+ndr->offset, 8);
|
||
|
@@ -217,6 +226,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ref_
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_udlong(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 4);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 8);
|
||
|
*v = NDR_IVAL(ndr, ndr->offset);
|
||
|
@@ -230,6 +240,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_udlo
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_udlongr(struct ndr_pull *ndr, int ndr_flags, uint64_t *v)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, 4);
|
||
|
NDR_PULL_NEED_BYTES(ndr, 8);
|
||
|
*v = ((uint64_t)NDR_IVAL(ndr, ndr->offset)) << 32;
|
||
|
@@ -264,6 +275,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_hype
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_pointer(struct ndr_pull *ndr, int ndr_flags, void* *v)
|
||
|
{
|
||
|
uintptr_t h;
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PULL_ALIGN(ndr, sizeof(h));
|
||
|
NDR_PULL_NEED_BYTES(ndr, sizeof(h));
|
||
|
memcpy(&h, ndr->data+ndr->offset, sizeof(h));
|
||
|
@@ -278,6 +290,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_poin
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_NTSTATUS(struct ndr_pull *ndr, int ndr_flags, NTSTATUS *status)
|
||
|
{
|
||
|
uint32_t v;
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
|
||
|
*status = NT_STATUS(v);
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
@@ -302,6 +315,7 @@ _PUBLIC_ void ndr_print_NTSTATUS(struct
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_WERROR(struct ndr_pull *ndr, int ndr_flags, WERROR *status)
|
||
|
{
|
||
|
uint32_t v;
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
|
||
|
*status = W_ERROR(v);
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
@@ -414,6 +428,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_byte
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_array_uint8(struct ndr_pull *ndr, int ndr_flags, uint8_t *data, uint32_t n)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
if (!(ndr_flags & NDR_SCALARS)) {
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -425,6 +440,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_arra
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_int8(struct ndr_push *ndr, int ndr_flags, int8_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 1);
|
||
|
SCVAL(ndr->data, ndr->offset, (uint8_t)v);
|
||
|
ndr->offset += 1;
|
||
|
@@ -436,6 +452,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int8
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_uint8(struct ndr_push *ndr, int ndr_flags, uint8_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 1);
|
||
|
SCVAL(ndr->data, ndr->offset, v);
|
||
|
ndr->offset += 1;
|
||
|
@@ -447,6 +464,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_int16(struct ndr_push *ndr, int ndr_flags, int16_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 2);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 2);
|
||
|
NDR_SSVAL(ndr, ndr->offset, (uint16_t)v);
|
||
|
@@ -459,6 +477,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int1
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_uint16(struct ndr_push *ndr, int ndr_flags, uint16_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 2);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 2);
|
||
|
NDR_SSVAL(ndr, ndr->offset, v);
|
||
|
@@ -482,6 +501,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_int32(struct ndr_push *ndr, int ndr_flags, int32_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 4);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 4);
|
||
|
NDR_SIVALS(ndr, ndr->offset, v);
|
||
|
@@ -494,6 +514,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_int3
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_uint32(struct ndr_push *ndr, int ndr_flags, uint32_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 4);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 4);
|
||
|
NDR_SIVAL(ndr, ndr->offset, v);
|
||
|
@@ -517,6 +538,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_uint
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_udlong(struct ndr_push *ndr, int ndr_flags, uint64_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 4);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 8);
|
||
|
NDR_SIVAL(ndr, ndr->offset, (v & 0xFFFFFFFF));
|
||
|
@@ -530,6 +552,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_udlo
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_udlongr(struct ndr_push *ndr, int ndr_flags, uint64_t v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 4);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 8);
|
||
|
NDR_SIVAL(ndr, ndr->offset, (v>>32));
|
||
|
@@ -563,6 +586,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_hype
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_double(struct ndr_push *ndr, int ndr_flags, double v)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, 8);
|
||
|
NDR_PUSH_NEED_BYTES(ndr, 8);
|
||
|
memcpy(ndr->data+ndr->offset, &v, 8);
|
||
|
@@ -576,6 +600,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_doub
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_pointer(struct ndr_push *ndr, int ndr_flags, void* v)
|
||
|
{
|
||
|
uintptr_t h = (intptr_t)v;
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_PUSH_ALIGN(ndr, sizeof(h));
|
||
|
NDR_PUSH_NEED_BYTES(ndr, sizeof(h));
|
||
|
memcpy(ndr->data+ndr->offset, &h, sizeof(h));
|
||
|
@@ -686,6 +711,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_zero
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
if (!(ndr_flags & NDR_SCALARS)) {
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -738,6 +764,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_ref_
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_push_udlong(ndr, ndr_flags, t));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -747,6 +774,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_pull_udlong(ndr, ndr_flags, t));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -756,6 +784,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_1sec(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
t /= 10000000;
|
||
|
NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
@@ -766,6 +795,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_NTTI
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_1sec(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
|
||
|
(*t) *= 10000000;
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
@@ -776,6 +806,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_pull_NTTIME_hyper(struct ndr_pull *ndr, int ndr_flags, NTTIME *t)
|
||
|
{
|
||
|
+ NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, t));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -785,6 +816,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_NTTI
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_NTTIME_hyper(struct ndr_push *ndr, int ndr_flags, NTTIME t)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t));
|
||
|
return NDR_ERR_SUCCESS;
|
||
|
}
|
||
|
@@ -814,6 +846,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_time
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_uid_t(struct ndr_push *ndr, int ndr_flags, uid_t u)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)u);
|
||
|
}
|
||
|
|
||
|
@@ -839,6 +872,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_uid_
|
||
|
*/
|
||
|
_PUBLIC_ enum ndr_err_code ndr_push_gid_t(struct ndr_push *ndr, int ndr_flags, gid_t g)
|
||
|
{
|
||
|
+ NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
|
||
|
return ndr_push_hyper(ndr, NDR_SCALARS, (uint64_t)g);
|
||
|
}
|
||
|
|
||
|
--- a/source3/lib/bitmap.c
|
||
|
+++ /dev/null
|
||
|
@@ -1,136 +0,0 @@
|
||
|
-/*
|
||
|
- Unix SMB/CIFS implementation.
|
||
|
- simple bitmap functions
|
||
|
- Copyright (C) Andrew Tridgell 1992-1998
|
||
|
-
|
||
|
- This program is free software; you can redistribute it and/or modify
|
||
|
- it under the terms of the GNU General Public License as published by
|
||
|
- the Free Software Foundation; either version 3 of the License, or
|
||
|
- (at your option) any later version.
|
||
|
-
|
||
|
- This program is distributed in the hope that it will be useful,
|
||
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
- GNU General Public License for more details.
|
||
|
-
|
||
|
- You should have received a copy of the GNU General Public License
|
||
|
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
-*/
|
||
|
-
|
||
|
-#include "includes.h"
|
||
|
-
|
||
|
-/* these functions provide a simple way to allocate integers from a
|
||
|
- pool without repetition */
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-talloc a bitmap
|
||
|
-****************************************************************************/
|
||
|
-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
|
||
|
-{
|
||
|
- struct bitmap *bm;
|
||
|
-
|
||
|
- bm = TALLOC_P(mem_ctx, struct bitmap);
|
||
|
-
|
||
|
- if (!bm) return NULL;
|
||
|
-
|
||
|
- bm->n = n;
|
||
|
- bm->b = TALLOC_ZERO_ARRAY(bm, uint32, (n+31)/32);
|
||
|
- if (!bm->b) {
|
||
|
- TALLOC_FREE(bm);
|
||
|
- return NULL;
|
||
|
- }
|
||
|
- return bm;
|
||
|
-}
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-copy as much of the source bitmap as will fit in the destination bitmap.
|
||
|
-****************************************************************************/
|
||
|
-
|
||
|
-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
|
||
|
-{
|
||
|
- int count = MIN(dst->n, src->n);
|
||
|
-
|
||
|
- SMB_ASSERT(dst->b != src->b);
|
||
|
- memcpy(dst->b, src->b, sizeof(uint32)*((count+31)/32));
|
||
|
-
|
||
|
- return count;
|
||
|
-}
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-set a bit in a bitmap
|
||
|
-****************************************************************************/
|
||
|
-bool bitmap_set(struct bitmap *bm, unsigned i)
|
||
|
-{
|
||
|
- if (i >= bm->n) {
|
||
|
- DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
|
||
|
- i, bm->n));
|
||
|
- return False;
|
||
|
- }
|
||
|
- bm->b[i/32] |= (1<<(i%32));
|
||
|
- return True;
|
||
|
-}
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-clear a bit in a bitmap
|
||
|
-****************************************************************************/
|
||
|
-bool bitmap_clear(struct bitmap *bm, unsigned i)
|
||
|
-{
|
||
|
- if (i >= bm->n) {
|
||
|
- DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
|
||
|
- i, bm->n));
|
||
|
- return False;
|
||
|
- }
|
||
|
- bm->b[i/32] &= ~(1<<(i%32));
|
||
|
- return True;
|
||
|
-}
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-query a bit in a bitmap
|
||
|
-****************************************************************************/
|
||
|
-bool bitmap_query(struct bitmap *bm, unsigned i)
|
||
|
-{
|
||
|
- if (i >= bm->n) return False;
|
||
|
- if (bm->b[i/32] & (1<<(i%32))) {
|
||
|
- return True;
|
||
|
- }
|
||
|
- return False;
|
||
|
-}
|
||
|
-
|
||
|
-/****************************************************************************
|
||
|
-find a zero bit in a bitmap starting at the specified offset, with
|
||
|
-wraparound
|
||
|
-****************************************************************************/
|
||
|
-int bitmap_find(struct bitmap *bm, unsigned ofs)
|
||
|
-{
|
||
|
- unsigned int i, j;
|
||
|
-
|
||
|
- if (ofs > bm->n) ofs = 0;
|
||
|
-
|
||
|
- i = ofs;
|
||
|
- while (i < bm->n) {
|
||
|
- if (~(bm->b[i/32])) {
|
||
|
- j = i;
|
||
|
- do {
|
||
|
- if (!bitmap_query(bm, j)) return j;
|
||
|
- j++;
|
||
|
- } while (j & 31 && j < bm->n);
|
||
|
- }
|
||
|
- i += 32;
|
||
|
- i &= ~31;
|
||
|
- }
|
||
|
-
|
||
|
- i = 0;
|
||
|
- while (i < ofs) {
|
||
|
- if (~(bm->b[i/32])) {
|
||
|
- j = i;
|
||
|
- do {
|
||
|
- if (!bitmap_query(bm, j)) return j;
|
||
|
- j++;
|
||
|
- } while (j & 31 && j < bm->n);
|
||
|
- }
|
||
|
- i += 32;
|
||
|
- i &= ~31;
|
||
|
- }
|
||
|
-
|
||
|
- return -1;
|
||
|
-}
|
||
|
--- /dev/null
|
||
|
+++ b/lib/util/bitmap.c
|
||
|
@@ -0,0 +1,137 @@
|
||
|
+/*
|
||
|
+ Unix SMB/CIFS implementation.
|
||
|
+ simple bitmap functions
|
||
|
+ Copyright (C) Andrew Tridgell 1992-1998
|
||
|
+
|
||
|
+ This program is free software; you can redistribute it and/or modify
|
||
|
+ it under the terms of the GNU General Public License as published by
|
||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||
|
+ (at your option) any later version.
|
||
|
+
|
||
|
+ This program is distributed in the hope that it will be useful,
|
||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+ GNU General Public License for more details.
|
||
|
+
|
||
|
+ You should have received a copy of the GNU General Public License
|
||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
+*/
|
||
|
+
|
||
|
+#include "includes.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
+
|
||
|
+/* these functions provide a simple way to allocate integers from a
|
||
|
+ pool without repetition */
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+talloc a bitmap
|
||
|
+****************************************************************************/
|
||
|
+struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
|
||
|
+{
|
||
|
+ struct bitmap *bm;
|
||
|
+
|
||
|
+ bm = talloc_zero(mem_ctx, struct bitmap);
|
||
|
+
|
||
|
+ if (!bm) return NULL;
|
||
|
+
|
||
|
+ bm->n = n;
|
||
|
+ bm->b = talloc_zero_array(bm, uint32_t, (n+31)/32);
|
||
|
+ if (!bm->b) {
|
||
|
+ TALLOC_FREE(bm);
|
||
|
+ return NULL;
|
||
|
+ }
|
||
|
+ return bm;
|
||
|
+}
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+copy as much of the source bitmap as will fit in the destination bitmap.
|
||
|
+****************************************************************************/
|
||
|
+
|
||
|
+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src)
|
||
|
+{
|
||
|
+ int count = MIN(dst->n, src->n);
|
||
|
+
|
||
|
+ SMB_ASSERT(dst->b != src->b);
|
||
|
+ memcpy(dst->b, src->b, sizeof(uint32_t)*((count+31)/32));
|
||
|
+
|
||
|
+ return count;
|
||
|
+}
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+set a bit in a bitmap
|
||
|
+****************************************************************************/
|
||
|
+bool bitmap_set(struct bitmap *bm, unsigned i)
|
||
|
+{
|
||
|
+ if (i >= bm->n) {
|
||
|
+ DEBUG(0,("Setting invalid bitmap entry %d (of %d)\n",
|
||
|
+ i, bm->n));
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ bm->b[i/32] |= (1<<(i%32));
|
||
|
+ return true;
|
||
|
+}
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+clear a bit in a bitmap
|
||
|
+****************************************************************************/
|
||
|
+bool bitmap_clear(struct bitmap *bm, unsigned i)
|
||
|
+{
|
||
|
+ if (i >= bm->n) {
|
||
|
+ DEBUG(0,("clearing invalid bitmap entry %d (of %d)\n",
|
||
|
+ i, bm->n));
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ bm->b[i/32] &= ~(1<<(i%32));
|
||
|
+ return true;
|
||
|
+}
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+query a bit in a bitmap
|
||
|
+****************************************************************************/
|
||
|
+bool bitmap_query(struct bitmap *bm, unsigned i)
|
||
|
+{
|
||
|
+ if (i >= bm->n) return false;
|
||
|
+ if (bm->b[i/32] & (1<<(i%32))) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ return false;
|
||
|
+}
|
||
|
+
|
||
|
+/****************************************************************************
|
||
|
+find a zero bit in a bitmap starting at the specified offset, with
|
||
|
+wraparound
|
||
|
+****************************************************************************/
|
||
|
+int bitmap_find(struct bitmap *bm, unsigned ofs)
|
||
|
+{
|
||
|
+ unsigned int i, j;
|
||
|
+
|
||
|
+ if (ofs > bm->n) ofs = 0;
|
||
|
+
|
||
|
+ i = ofs;
|
||
|
+ while (i < bm->n) {
|
||
|
+ if (~(bm->b[i/32])) {
|
||
|
+ j = i;
|
||
|
+ do {
|
||
|
+ if (!bitmap_query(bm, j)) return j;
|
||
|
+ j++;
|
||
|
+ } while (j & 31 && j < bm->n);
|
||
|
+ }
|
||
|
+ i += 32;
|
||
|
+ i &= ~31;
|
||
|
+ }
|
||
|
+
|
||
|
+ i = 0;
|
||
|
+ while (i < ofs) {
|
||
|
+ if (~(bm->b[i/32])) {
|
||
|
+ j = i;
|
||
|
+ do {
|
||
|
+ if (!bitmap_query(bm, j)) return j;
|
||
|
+ j++;
|
||
|
+ } while (j & 31 && j < bm->n);
|
||
|
+ }
|
||
|
+ i += 32;
|
||
|
+ i &= ~31;
|
||
|
+ }
|
||
|
+
|
||
|
+ return -1;
|
||
|
+}
|
||
|
--- /dev/null
|
||
|
+++ b/lib/util/bitmap.h
|
||
|
@@ -0,0 +1,32 @@
|
||
|
+/*
|
||
|
+ Unix SMB/CIFS implementation.
|
||
|
+ simple bitmap functions
|
||
|
+ Copyright (C) Andrew Tridgell 1992-1998
|
||
|
+
|
||
|
+ This program is free software; you can redistribute it and/or modify
|
||
|
+ it under the terms of the GNU General Public License as published by
|
||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||
|
+ (at your option) any later version.
|
||
|
+
|
||
|
+ This program is distributed in the hope that it will be useful,
|
||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+ GNU General Public License for more details.
|
||
|
+
|
||
|
+ You should have received a copy of the GNU General Public License
|
||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
+*/
|
||
|
+
|
||
|
+/* The following definitions come from lib/bitmap.c */
|
||
|
+
|
||
|
+struct bitmap {
|
||
|
+ uint32_t *b;
|
||
|
+ unsigned int n;
|
||
|
+};
|
||
|
+
|
||
|
+struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n);
|
||
|
+int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src);
|
||
|
+bool bitmap_set(struct bitmap *bm, unsigned i);
|
||
|
+bool bitmap_clear(struct bitmap *bm, unsigned i);
|
||
|
+bool bitmap_query(struct bitmap *bm, unsigned i);
|
||
|
+int bitmap_find(struct bitmap *bm, unsigned ofs);
|
||
|
--- a/lib/util/wscript_build
|
||
|
+++ b/lib/util/wscript_build
|
||
|
@@ -99,5 +99,11 @@ bld.SAMBA_LIBRARY('tdb-wrap',
|
||
|
public_headers='tdb_wrap.h',
|
||
|
private_library=True,
|
||
|
local_include=False
|
||
|
- )
|
||
|
+ )
|
||
|
+
|
||
|
+bld.SAMBA_LIBRARY('bitmap',
|
||
|
+ source='bitmap.c',
|
||
|
+ deps='talloc samba-util',
|
||
|
+ local_include=False,
|
||
|
+ private_library=True)
|
||
|
|
||
|
--- a/source3/include/proto.h
|
||
|
+++ b/source3/include/proto.h
|
||
|
@@ -61,15 +61,6 @@ const char *audit_description_str(uint32
|
||
|
bool get_audit_category_from_param(const char *param, uint32 *audit_category);
|
||
|
const char *audit_policy_str(TALLOC_CTX *mem_ctx, uint32 policy);
|
||
|
|
||
|
-/* The following definitions come from lib/bitmap.c */
|
||
|
-
|
||
|
-struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n);
|
||
|
-int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src);
|
||
|
-bool bitmap_set(struct bitmap *bm, unsigned i);
|
||
|
-bool bitmap_clear(struct bitmap *bm, unsigned i);
|
||
|
-bool bitmap_query(struct bitmap *bm, unsigned i);
|
||
|
-int bitmap_find(struct bitmap *bm, unsigned ofs);
|
||
|
-
|
||
|
/* The following definitions come from lib/charcnv.c */
|
||
|
|
||
|
char lp_failed_convert_char(void);
|
||
|
--- a/source3/include/smb.h
|
||
|
+++ b/source3/include/smb.h
|
||
|
@@ -712,7 +712,6 @@ struct connections_data {
|
||
|
uint32 unused_compatitibility_field;
|
||
|
};
|
||
|
|
||
|
-
|
||
|
/* the following are used by loadparm for option lists */
|
||
|
typedef enum {
|
||
|
P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,P_LIST,
|
||
|
@@ -759,11 +758,6 @@ struct parm_struct {
|
||
|
#define FLAG_META 0x8000 /* A meta directive - not a real parameter */
|
||
|
#define FLAG_CMDLINE 0x10000 /* option has been overridden */
|
||
|
|
||
|
-struct bitmap {
|
||
|
- uint32 *b;
|
||
|
- unsigned int n;
|
||
|
-};
|
||
|
-
|
||
|
/* offsets into message for common items */
|
||
|
#define smb_com 8
|
||
|
#define smb_rcls 9
|
||
|
--- a/source3/modules/vfs_acl_common.c
|
||
|
+++ b/source3/modules/vfs_acl_common.c
|
||
|
@@ -23,6 +23,7 @@
|
||
|
#include "system/filesys.h"
|
||
|
#include "../libcli/security/security.h"
|
||
|
#include "../librpc/gen_ndr/ndr_security.h"
|
||
|
+#include "../lib/util/bitmap.h"
|
||
|
|
||
|
static NTSTATUS create_acl_blob(const struct security_descriptor *psd,
|
||
|
DATA_BLOB *pblob,
|
||
|
--- a/source3/modules/vfs_full_audit.c
|
||
|
+++ b/source3/modules/vfs_full_audit.c
|
||
|
@@ -64,6 +64,7 @@
|
||
|
#include "../librpc/gen_ndr/ndr_netlogon.h"
|
||
|
#include "auth.h"
|
||
|
#include "ntioctl.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
|
||
|
static int vfs_full_audit_debug_level = DBGC_VFS;
|
||
|
|
||
|
--- a/source3/param/loadparm.c
|
||
|
+++ b/source3/param/loadparm.c
|
||
|
@@ -64,6 +64,7 @@
|
||
|
#include "smb_signing.h"
|
||
|
#include "dbwrap.h"
|
||
|
#include "smbldap.h"
|
||
|
+#include "../lib/util/bitmap.h"
|
||
|
|
||
|
#ifdef HAVE_SYS_SYSCTL_H
|
||
|
#include <sys/sysctl.h>
|
||
|
--- a/source3/passdb/pdb_get_set.c
|
||
|
+++ b/source3/passdb/pdb_get_set.c
|
||
|
@@ -25,6 +25,7 @@
|
||
|
#include "passdb.h"
|
||
|
#include "../libcli/auth/libcli_auth.h"
|
||
|
#include "../libcli/security/security.h"
|
||
|
+#include "../lib/util/bitmap.h"
|
||
|
|
||
|
#undef DBGC_CLASS
|
||
|
#define DBGC_CLASS DBGC_PASSDB
|
||
|
--- a/source3/smbd/conn.c
|
||
|
+++ b/source3/smbd/conn.c
|
||
|
@@ -23,6 +23,7 @@
|
||
|
#include "smbd/smbd.h"
|
||
|
#include "smbd/globals.h"
|
||
|
#include "rpc_server/rpc_ncacn_np.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
|
||
|
/* The connections bitmap is expanded in increments of BITMAP_BLOCK_SZ. The
|
||
|
* maximum size of the bitmap is the largest positive integer, but you will hit
|
||
|
--- a/source3/smbd/dir.c
|
||
|
+++ b/source3/smbd/dir.c
|
||
|
@@ -23,6 +23,7 @@
|
||
|
#include "smbd/smbd.h"
|
||
|
#include "smbd/globals.h"
|
||
|
#include "libcli/security/security.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
|
||
|
/*
|
||
|
This module implements directory related functions for Samba.
|
||
|
--- a/source3/smbd/files.c
|
||
|
+++ b/source3/smbd/files.c
|
||
|
@@ -22,6 +22,7 @@
|
||
|
#include "smbd/globals.h"
|
||
|
#include "libcli/security/security.h"
|
||
|
#include "util_tdb.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
|
||
|
#define VALID_FNUM(fnum) (((fnum) >= 0) && ((fnum) < real_max_open_files))
|
||
|
|
||
|
--- a/source3/smbd/smb2_server.c
|
||
|
+++ b/source3/smbd/smb2_server.c
|
||
|
@@ -26,6 +26,7 @@
|
||
|
#include "../lib/tsocket/tsocket.h"
|
||
|
#include "../lib/util/tevent_ntstatus.h"
|
||
|
#include "smbprofile.h"
|
||
|
+#include "../lib/util/bitmap.h"
|
||
|
|
||
|
#define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9)
|
||
|
|
||
|
--- a/source3/rpc_client/cli_pipe.c
|
||
|
+++ b/source3/rpc_client/cli_pipe.c
|
||
|
@@ -28,6 +28,7 @@
|
||
|
#include "../libcli/auth/ntlmssp.h"
|
||
|
#include "ntlmssp_wrap.h"
|
||
|
#include "librpc/gen_ndr/ndr_dcerpc.h"
|
||
|
+#include "librpc/gen_ndr/ndr_netlogon_c.h"
|
||
|
#include "librpc/rpc/dcerpc.h"
|
||
|
#include "librpc/crypto/gse.h"
|
||
|
#include "librpc/crypto/spnego.h"
|
||
|
@@ -399,6 +400,7 @@ static NTSTATUS cli_pipe_validate_curren
|
||
|
struct ncacn_packet *pkt,
|
||
|
DATA_BLOB *pdu,
|
||
|
uint8_t expected_pkt_type,
|
||
|
+ uint32_t call_id,
|
||
|
DATA_BLOB *rdata,
|
||
|
DATA_BLOB *reply_pdu)
|
||
|
{
|
||
|
@@ -497,7 +499,7 @@ static NTSTATUS cli_pipe_validate_curren
|
||
|
"from %s!\n",
|
||
|
(unsigned int)pkt->ptype,
|
||
|
rpccli_pipe_txt(talloc_tos(), cli)));
|
||
|
- return NT_STATUS_INVALID_INFO_CLASS;
|
||
|
+ return NT_STATUS_RPC_PROTOCOL_ERROR;
|
||
|
}
|
||
|
|
||
|
if (pkt->ptype != expected_pkt_type) {
|
||
|
@@ -505,7 +507,15 @@ static NTSTATUS cli_pipe_validate_curren
|
||
|
"RPC packet type - %u, not %u\n",
|
||
|
rpccli_pipe_txt(talloc_tos(), cli),
|
||
|
pkt->ptype, expected_pkt_type));
|
||
|
- return NT_STATUS_INVALID_INFO_CLASS;
|
||
|
+ return NT_STATUS_RPC_PROTOCOL_ERROR;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pkt->call_id != call_id) {
|
||
|
+ DEBUG(3, (__location__ ": Connection to %s got an unexpected "
|
||
|
+ "RPC call_id - %u, not %u\n",
|
||
|
+ rpccli_pipe_txt(talloc_tos(), cli),
|
||
|
+ pkt->call_id, call_id));
|
||
|
+ return NT_STATUS_RPC_PROTOCOL_ERROR;
|
||
|
}
|
||
|
|
||
|
/* Do this just before return - we don't want to modify any rpc header
|
||
|
@@ -898,6 +908,7 @@ static void rpc_api_pipe_got_pdu(struct
|
||
|
state->cli, state->pkt,
|
||
|
&state->incoming_frag,
|
||
|
state->expected_pkt_type,
|
||
|
+ state->call_id,
|
||
|
&rdata,
|
||
|
&state->reply_pdu);
|
||
|
|
||
|
@@ -1269,12 +1280,17 @@ struct rpc_api_pipe_req_state {
|
||
|
uint32_t call_id;
|
||
|
DATA_BLOB *req_data;
|
||
|
uint32_t req_data_sent;
|
||
|
+ DATA_BLOB req_trailer;
|
||
|
+ uint32_t req_trailer_sent;
|
||
|
+ bool verify_bitmask1;
|
||
|
+ bool verify_pcontext;
|
||
|
DATA_BLOB rpc_out;
|
||
|
DATA_BLOB reply_pdu;
|
||
|
};
|
||
|
|
||
|
static void rpc_api_pipe_req_write_done(struct tevent_req *subreq);
|
||
|
static void rpc_api_pipe_req_done(struct tevent_req *subreq);
|
||
|
+static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state);
|
||
|
static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state,
|
||
|
bool *is_last_frag);
|
||
|
|
||
|
@@ -1310,6 +1326,11 @@ struct tevent_req *rpc_api_pipe_req_send
|
||
|
goto post_status;
|
||
|
}
|
||
|
|
||
|
+ status = prepare_verification_trailer(state);
|
||
|
+ if (!NT_STATUS_IS_OK(status)) {
|
||
|
+ goto post_status;
|
||
|
+ }
|
||
|
+
|
||
|
status = prepare_next_frag(state, &is_last_frag);
|
||
|
if (!NT_STATUS_IS_OK(status)) {
|
||
|
goto post_status;
|
||
|
@@ -1344,25 +1365,161 @@ struct tevent_req *rpc_api_pipe_req_send
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
+static NTSTATUS prepare_verification_trailer(struct rpc_api_pipe_req_state *state)
|
||
|
+{
|
||
|
+ struct pipe_auth_data *a = state->cli->auth;
|
||
|
+ struct dcerpc_sec_verification_trailer *t;
|
||
|
+ struct dcerpc_sec_vt *c = NULL;
|
||
|
+ struct ndr_push *ndr = NULL;
|
||
|
+ enum ndr_err_code ndr_err;
|
||
|
+ size_t align = 0;
|
||
|
+ size_t pad = 0;
|
||
|
+
|
||
|
+ if (a == NULL) {
|
||
|
+ return NT_STATUS_OK;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (a->auth_level < DCERPC_AUTH_LEVEL_INTEGRITY) {
|
||
|
+ return NT_STATUS_OK;
|
||
|
+ }
|
||
|
+
|
||
|
+ t = talloc_zero(state, struct dcerpc_sec_verification_trailer);
|
||
|
+ if (t == NULL) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!a->verified_bitmask1) {
|
||
|
+ t->commands = talloc_realloc(t, t->commands,
|
||
|
+ struct dcerpc_sec_vt,
|
||
|
+ t->count.count + 1);
|
||
|
+ if (t->commands == NULL) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+ c = &t->commands[t->count.count++];
|
||
|
+ ZERO_STRUCTP(c);
|
||
|
+
|
||
|
+ c->command = DCERPC_SEC_VT_COMMAND_BITMASK1;
|
||
|
+ state->verify_bitmask1 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!state->cli->verified_pcontext) {
|
||
|
+ t->commands = talloc_realloc(t, t->commands,
|
||
|
+ struct dcerpc_sec_vt,
|
||
|
+ t->count.count + 1);
|
||
|
+ if (t->commands == NULL) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+ c = &t->commands[t->count.count++];
|
||
|
+ ZERO_STRUCTP(c);
|
||
|
+
|
||
|
+ c->command = DCERPC_SEC_VT_COMMAND_PCONTEXT;
|
||
|
+ c->u.pcontext.abstract_syntax = state->cli->abstract_syntax;
|
||
|
+ c->u.pcontext.transfer_syntax = state->cli->transfer_syntax;
|
||
|
+
|
||
|
+ state->verify_pcontext = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (true) { /* We do not support header signing */
|
||
|
+ t->commands = talloc_realloc(t, t->commands,
|
||
|
+ struct dcerpc_sec_vt,
|
||
|
+ t->count.count + 1);
|
||
|
+ if (t->commands == NULL) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+ c = &t->commands[t->count.count++];
|
||
|
+ ZERO_STRUCTP(c);
|
||
|
+
|
||
|
+ c->command = DCERPC_SEC_VT_COMMAND_HEADER2;
|
||
|
+ c->u.header2.ptype = DCERPC_PKT_REQUEST;
|
||
|
+ c->u.header2.drep[0] = DCERPC_DREP_LE;
|
||
|
+ c->u.header2.drep[1] = 0;
|
||
|
+ c->u.header2.drep[2] = 0;
|
||
|
+ c->u.header2.drep[3] = 0;
|
||
|
+ c->u.header2.call_id = state->call_id;
|
||
|
+ c->u.header2.context_id = 0;
|
||
|
+ c->u.header2.opnum = state->op_num;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (t->count.count == 0) {
|
||
|
+ TALLOC_FREE(t);
|
||
|
+ return NT_STATUS_OK;
|
||
|
+ }
|
||
|
+
|
||
|
+ c = &t->commands[t->count.count - 1];
|
||
|
+ c->command |= DCERPC_SEC_VT_COMMAND_END;
|
||
|
+
|
||
|
+ if (DEBUGLEVEL >= 10) {
|
||
|
+ NDR_PRINT_DEBUG(dcerpc_sec_verification_trailer, t);
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr = ndr_push_init_ctx(state);
|
||
|
+ if (ndr == NULL) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr_err = ndr_push_dcerpc_sec_verification_trailer(ndr,
|
||
|
+ NDR_SCALARS | NDR_BUFFERS,
|
||
|
+ t);
|
||
|
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
|
||
|
+ return ndr_map_error2ntstatus(ndr_err);
|
||
|
+ }
|
||
|
+ state->req_trailer = ndr_push_blob(ndr);
|
||
|
+
|
||
|
+ align = state->req_data->length & 0x3;
|
||
|
+ if (align > 0) {
|
||
|
+ pad = 4 - align;
|
||
|
+ }
|
||
|
+ if (pad > 0) {
|
||
|
+ bool ok;
|
||
|
+ uint8_t *p;
|
||
|
+ const uint8_t zeros[4] = { 0, };
|
||
|
+
|
||
|
+ ok = data_blob_append(ndr, &state->req_trailer, zeros, pad);
|
||
|
+ if (!ok) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* move the padding to the start */
|
||
|
+ p = state->req_trailer.data;
|
||
|
+ memmove(p + pad, p, state->req_trailer.length - pad);
|
||
|
+ memset(p, 0, pad);
|
||
|
+ }
|
||
|
+
|
||
|
+ return NT_STATUS_OK;
|
||
|
+}
|
||
|
+
|
||
|
static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state,
|
||
|
bool *is_last_frag)
|
||
|
{
|
||
|
- size_t data_sent_thistime;
|
||
|
size_t auth_len;
|
||
|
size_t frag_len;
|
||
|
uint8_t flags = 0;
|
||
|
size_t pad_len;
|
||
|
size_t data_left;
|
||
|
+ size_t data_thistime;
|
||
|
+ size_t trailer_left;
|
||
|
+ size_t trailer_thistime = 0;
|
||
|
+ size_t total_left;
|
||
|
+ size_t total_thistime;
|
||
|
NTSTATUS status;
|
||
|
+ bool ok;
|
||
|
union dcerpc_payload u;
|
||
|
|
||
|
data_left = state->req_data->length - state->req_data_sent;
|
||
|
+ trailer_left = state->req_trailer.length - state->req_trailer_sent;
|
||
|
+ total_left = data_left + trailer_left;
|
||
|
+ if ((total_left < data_left) || (total_left < trailer_left)) {
|
||
|
+ /*
|
||
|
+ * overflow
|
||
|
+ */
|
||
|
+ return NT_STATUS_INVALID_PARAMETER_MIX;
|
||
|
+ }
|
||
|
|
||
|
status = dcerpc_guess_sizes(state->cli->auth,
|
||
|
- DCERPC_REQUEST_LENGTH, data_left,
|
||
|
+ DCERPC_REQUEST_LENGTH, total_left,
|
||
|
state->cli->max_xmit_frag,
|
||
|
CLIENT_NDR_PADDING_SIZE,
|
||
|
- &data_sent_thistime,
|
||
|
+ &total_thistime,
|
||
|
&frag_len, &auth_len, &pad_len);
|
||
|
if (!NT_STATUS_IS_OK(status)) {
|
||
|
return status;
|
||
|
@@ -1372,15 +1529,20 @@ static NTSTATUS prepare_next_frag(struct
|
||
|
flags = DCERPC_PFC_FLAG_FIRST;
|
||
|
}
|
||
|
|
||
|
- if (data_sent_thistime == data_left) {
|
||
|
+ if (total_thistime == total_left) {
|
||
|
flags |= DCERPC_PFC_FLAG_LAST;
|
||
|
}
|
||
|
|
||
|
+ data_thistime = MIN(total_thistime, data_left);
|
||
|
+ if (data_thistime < total_thistime) {
|
||
|
+ trailer_thistime = total_thistime - data_thistime;
|
||
|
+ }
|
||
|
+
|
||
|
data_blob_free(&state->rpc_out);
|
||
|
|
||
|
ZERO_STRUCT(u.request);
|
||
|
|
||
|
- u.request.alloc_hint = state->req_data->length;
|
||
|
+ u.request.alloc_hint = total_left;
|
||
|
u.request.context_id = 0;
|
||
|
u.request.opnum = state->op_num;
|
||
|
|
||
|
@@ -1400,11 +1562,26 @@ static NTSTATUS prepare_next_frag(struct
|
||
|
* at this stage */
|
||
|
dcerpc_set_frag_length(&state->rpc_out, frag_len);
|
||
|
|
||
|
- /* Copy in the data. */
|
||
|
- if (!data_blob_append(NULL, &state->rpc_out,
|
||
|
+ if (data_thistime > 0) {
|
||
|
+ /* Copy in the data. */
|
||
|
+ ok = data_blob_append(NULL, &state->rpc_out,
|
||
|
state->req_data->data + state->req_data_sent,
|
||
|
- data_sent_thistime)) {
|
||
|
- return NT_STATUS_NO_MEMORY;
|
||
|
+ data_thistime);
|
||
|
+ if (!ok) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+ state->req_data_sent += data_thistime;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (trailer_thistime > 0) {
|
||
|
+ /* Copy in the verification trailer. */
|
||
|
+ ok = data_blob_append(NULL, &state->rpc_out,
|
||
|
+ state->req_trailer.data + state->req_trailer_sent,
|
||
|
+ trailer_thistime);
|
||
|
+ if (!ok) {
|
||
|
+ return NT_STATUS_NO_MEMORY;
|
||
|
+ }
|
||
|
+ state->req_trailer_sent += trailer_thistime;
|
||
|
}
|
||
|
|
||
|
switch (state->cli->auth->auth_level) {
|
||
|
@@ -1424,7 +1601,6 @@ static NTSTATUS prepare_next_frag(struct
|
||
|
return NT_STATUS_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
- state->req_data_sent += data_sent_thistime;
|
||
|
*is_last_frag = ((flags & DCERPC_PFC_FLAG_LAST) != 0);
|
||
|
|
||
|
return status;
|
||
|
@@ -1488,6 +1664,20 @@ static void rpc_api_pipe_req_done(struct
|
||
|
tevent_req_nterror(req, status);
|
||
|
return;
|
||
|
}
|
||
|
+
|
||
|
+ if (state->cli->auth == NULL) {
|
||
|
+ tevent_req_done(req);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (state->verify_bitmask1) {
|
||
|
+ state->cli->auth->verified_bitmask1 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (state->verify_pcontext) {
|
||
|
+ state->cli->verified_pcontext = true;
|
||
|
+ }
|
||
|
+
|
||
|
tevent_req_done(req);
|
||
|
}
|
||
|
|
||
|
@@ -1647,9 +1837,15 @@ struct rpc_pipe_bind_state {
|
||
|
DATA_BLOB rpc_out;
|
||
|
bool auth3;
|
||
|
uint32_t rpc_call_id;
|
||
|
+ struct netr_Authenticator auth;
|
||
|
+ struct netr_Authenticator return_auth;
|
||
|
+ struct netlogon_creds_CredentialState *creds;
|
||
|
+ union netr_Capabilities capabilities;
|
||
|
+ struct netr_LogonGetCapabilities r;
|
||
|
};
|
||
|
|
||
|
static void rpc_pipe_bind_step_one_done(struct tevent_req *subreq);
|
||
|
+static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req);
|
||
|
static NTSTATUS rpc_bind_next_send(struct tevent_req *req,
|
||
|
struct rpc_pipe_bind_state *state,
|
||
|
DATA_BLOB *credentials);
|
||
|
@@ -1753,11 +1949,14 @@ static void rpc_pipe_bind_step_one_done(
|
||
|
|
||
|
case DCERPC_AUTH_TYPE_NONE:
|
||
|
case DCERPC_AUTH_TYPE_NCALRPC_AS_SYSTEM:
|
||
|
- case DCERPC_AUTH_TYPE_SCHANNEL:
|
||
|
/* Bind complete. */
|
||
|
tevent_req_done(req);
|
||
|
return;
|
||
|
|
||
|
+ case DCERPC_AUTH_TYPE_SCHANNEL:
|
||
|
+ rpc_pipe_bind_step_two_trigger(req);
|
||
|
+ return;
|
||
|
+
|
||
|
case DCERPC_AUTH_TYPE_NTLMSSP:
|
||
|
case DCERPC_AUTH_TYPE_SPNEGO:
|
||
|
case DCERPC_AUTH_TYPE_KRB5:
|
||
|
@@ -1869,6 +2068,153 @@ err_out:
|
||
|
tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
|
||
|
}
|
||
|
|
||
|
+static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq);
|
||
|
+
|
||
|
+static void rpc_pipe_bind_step_two_trigger(struct tevent_req *req)
|
||
|
+{
|
||
|
+ struct rpc_pipe_bind_state *state =
|
||
|
+ tevent_req_data(req,
|
||
|
+ struct rpc_pipe_bind_state);
|
||
|
+ struct dcerpc_binding_handle *b = state->cli->binding_handle;
|
||
|
+ struct schannel_state *schannel_auth =
|
||
|
+ talloc_get_type_abort(state->cli->auth->auth_ctx,
|
||
|
+ struct schannel_state);
|
||
|
+ struct tevent_req *subreq;
|
||
|
+
|
||
|
+ if (schannel_auth == NULL ||
|
||
|
+ !ndr_syntax_id_equal(&state->cli->abstract_syntax,
|
||
|
+ &ndr_table_netlogon.syntax_id)) {
|
||
|
+ tevent_req_done(req);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ ZERO_STRUCT(state->return_auth);
|
||
|
+
|
||
|
+ state->creds = netlogon_creds_copy(state, schannel_auth->creds);
|
||
|
+ if (state->creds == NULL) {
|
||
|
+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ netlogon_creds_client_authenticator(state->creds, &state->auth);
|
||
|
+
|
||
|
+ state->r.in.server_name = state->cli->srv_name_slash;
|
||
|
+ state->r.in.computer_name = state->creds->computer_name;
|
||
|
+ state->r.in.credential = &state->auth;
|
||
|
+ state->r.in.query_level = 1;
|
||
|
+ state->r.in.return_authenticator = &state->return_auth;
|
||
|
+
|
||
|
+ state->r.out.capabilities = &state->capabilities;
|
||
|
+ state->r.out.return_authenticator = &state->return_auth;
|
||
|
+
|
||
|
+ subreq = dcerpc_netr_LogonGetCapabilities_r_send(talloc_tos(),
|
||
|
+ state->ev,
|
||
|
+ b,
|
||
|
+ &state->r);
|
||
|
+ if (subreq == NULL) {
|
||
|
+ tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ tevent_req_set_callback(subreq, rpc_pipe_bind_step_two_done, req);
|
||
|
+ return;
|
||
|
+}
|
||
|
+
|
||
|
+static void rpc_pipe_bind_step_two_done(struct tevent_req *subreq)
|
||
|
+{
|
||
|
+ struct tevent_req *req =
|
||
|
+ tevent_req_callback_data(subreq,
|
||
|
+ struct tevent_req);
|
||
|
+ struct rpc_pipe_bind_state *state =
|
||
|
+ tevent_req_data(req,
|
||
|
+ struct rpc_pipe_bind_state);
|
||
|
+ struct schannel_state *schannel_auth =
|
||
|
+ talloc_get_type_abort(state->cli->auth->auth_ctx,
|
||
|
+ struct schannel_state);
|
||
|
+ NTSTATUS status;
|
||
|
+
|
||
|
+ status = dcerpc_netr_LogonGetCapabilities_r_recv(subreq, talloc_tos());
|
||
|
+ TALLOC_FREE(subreq);
|
||
|
+ if (NT_STATUS_EQUAL(status, NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE)) {
|
||
|
+ if (state->cli->dc->negotiate_flags &
|
||
|
+ NETLOGON_NEG_SUPPORTS_AES) {
|
||
|
+ DEBUG(5, ("AES is not supported and the error was %s\n",
|
||
|
+ nt_errstr(status)));
|
||
|
+ tevent_req_nterror(req,
|
||
|
+ NT_STATUS_INVALID_NETWORK_RESPONSE);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* This is probably NT */
|
||
|
+ DEBUG(5, ("We are checking against an NT - %s\n",
|
||
|
+ nt_errstr(status)));
|
||
|
+ tevent_req_done(req);
|
||
|
+ return;
|
||
|
+ } else if (!NT_STATUS_IS_OK(status)) {
|
||
|
+ DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n",
|
||
|
+ nt_errstr(status)));
|
||
|
+ tevent_req_nterror(req, status);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (NT_STATUS_EQUAL(state->r.out.result, NT_STATUS_NOT_IMPLEMENTED)) {
|
||
|
+ if (state->creds->negotiate_flags & NETLOGON_NEG_SUPPORTS_AES) {
|
||
|
+ /* This means AES isn't supported. */
|
||
|
+ DEBUG(5, ("AES is not supported and the error was %s\n",
|
||
|
+ nt_errstr(state->r.out.result)));
|
||
|
+ tevent_req_nterror(req,
|
||
|
+ NT_STATUS_INVALID_NETWORK_RESPONSE);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* This is probably an old Samba version */
|
||
|
+ DEBUG(5, ("We are checking against an old Samba version - %s\n",
|
||
|
+ nt_errstr(state->r.out.result)));
|
||
|
+ tevent_req_done(req);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* We need to check the credential state here, cause win2k3 and earlier
|
||
|
+ * returns NT_STATUS_NOT_IMPLEMENTED */
|
||
|
+ if (!netlogon_creds_client_check(state->creds,
|
||
|
+ &state->r.out.return_authenticator->cred)) {
|
||
|
+ /*
|
||
|
+ * Server replied with bad credential. Fail.
|
||
|
+ */
|
||
|
+ DEBUG(0,("rpc_pipe_bind_step_two_done: server %s "
|
||
|
+ "replied with bad credential\n",
|
||
|
+ state->cli->desthost));
|
||
|
+ tevent_req_nterror(req, NT_STATUS_UNSUCCESSFUL);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ TALLOC_FREE(schannel_auth->creds);
|
||
|
+ schannel_auth->creds = talloc_steal(state->cli, state->creds);
|
||
|
+
|
||
|
+ if (!NT_STATUS_IS_OK(state->r.out.result)) {
|
||
|
+ DEBUG(0, ("dcerpc_netr_LogonGetCapabilities_r_recv failed with %s\n",
|
||
|
+ nt_errstr(state->r.out.result)));
|
||
|
+ tevent_req_nterror(req, state->r.out.result);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (state->creds->negotiate_flags !=
|
||
|
+ state->r.out.capabilities->server_capabilities) {
|
||
|
+ DEBUG(0, ("The client capabilities don't match the server "
|
||
|
+ "capabilities: local[0x%08X] remote[0x%08X]\n",
|
||
|
+ state->creds->negotiate_flags,
|
||
|
+ state->capabilities.server_capabilities));
|
||
|
+ tevent_req_nterror(req,
|
||
|
+ NT_STATUS_INVALID_NETWORK_RESPONSE);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* TODO: Add downgrade dectection. */
|
||
|
+
|
||
|
+ tevent_req_done(req);
|
||
|
+ return;
|
||
|
+}
|
||
|
+
|
||
|
static NTSTATUS rpc_bind_next_send(struct tevent_req *req,
|
||
|
struct rpc_pipe_bind_state *state,
|
||
|
DATA_BLOB *auth_token)
|
||
|
--- a/source3/librpc/rpc/dcerpc.h
|
||
|
+++ b/source3/librpc/rpc/dcerpc.h
|
||
|
@@ -39,6 +39,7 @@ struct NL_AUTH_MESSAGE;
|
||
|
struct pipe_auth_data {
|
||
|
enum dcerpc_AuthType auth_type;
|
||
|
enum dcerpc_AuthLevel auth_level;
|
||
|
+ bool verified_bitmask1;
|
||
|
|
||
|
void *auth_ctx;
|
||
|
|
||
|
--- a/source3/rpc_client/rpc_client.h
|
||
|
+++ b/source3/rpc_client/rpc_client.h
|
||
|
@@ -39,6 +39,7 @@ struct rpc_pipe_client {
|
||
|
|
||
|
struct ndr_syntax_id abstract_syntax;
|
||
|
struct ndr_syntax_id transfer_syntax;
|
||
|
+ bool verified_pcontext;
|
||
|
|
||
|
char *desthost;
|
||
|
char *srv_name_slash;
|
||
|
--- /dev/null
|
||
|
+++ b/librpc/ndr/ndr_dcerpc.h
|
||
|
@@ -0,0 +1,25 @@
|
||
|
+/*
|
||
|
+ Unix SMB/CIFS implementation.
|
||
|
+
|
||
|
+ Manually parsed structures found in the DCERPC protocol
|
||
|
+
|
||
|
+ Copyright (C) Stefan Metzmacher 2014
|
||
|
+ Copyright (C) Gregor Beck 2014
|
||
|
+
|
||
|
+ This program is free software; you can redistribute it and/or modify
|
||
|
+ it under the terms of the GNU General Public License as published by
|
||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||
|
+ (at your option) any later version.
|
||
|
+
|
||
|
+ This program is distributed in the hope that it will be useful,
|
||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+ GNU General Public License for more details.
|
||
|
+
|
||
|
+ You should have received a copy of the GNU General Public License
|
||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
+*/
|
||
|
+
|
||
|
+enum ndr_err_code ndr_pop_dcerpc_sec_verification_trailer(
|
||
|
+ struct ndr_pull *ndr, TALLOC_CTX *mem_ctx,
|
||
|
+ struct dcerpc_sec_verification_trailer **_r);
|
||
|
--- /dev/null
|
||
|
+++ b/librpc/ABI/ndr-0.0.3.sigs
|
||
|
@@ -0,0 +1,251 @@
|
||
|
+GUID_all_zero: bool (const struct GUID *)
|
||
|
+GUID_compare: int (const struct GUID *, const struct GUID *)
|
||
|
+GUID_equal: bool (const struct GUID *, const struct GUID *)
|
||
|
+GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
|
||
|
+GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *)
|
||
|
+GUID_from_string: NTSTATUS (const char *, struct GUID *)
|
||
|
+GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_random: struct GUID (void)
|
||
|
+GUID_string: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_string2: char *(TALLOC_CTX *, const struct GUID *)
|
||
|
+GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *)
|
||
|
+GUID_zero: struct GUID (void)
|
||
|
+ndr_align_size: size_t (uint32_t, size_t)
|
||
|
+ndr_charset_length: uint32_t (const void *, charset_t)
|
||
|
+ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
|
||
|
+ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t)
|
||
|
+ndr_check_padding: void (struct ndr_pull *, size_t)
|
||
|
+ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t)
|
||
|
+ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t)
|
||
|
+ndr_get_array_length: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_get_array_size: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_map_error2errno: int (enum ndr_err_code)
|
||
|
+ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code)
|
||
|
+ndr_map_error2string: const char *(enum ndr_err_code)
|
||
|
+ndr_policy_handle_empty: bool (const struct policy_handle *)
|
||
|
+ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *)
|
||
|
+ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB)
|
||
|
+ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *)
|
||
|
+ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS)
|
||
|
+ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME)
|
||
|
+ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR)
|
||
|
+ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t)
|
||
|
+ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t)
|
||
|
+ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t)
|
||
|
+ndr_print_bool: void (struct ndr_print *, const char *, const bool)
|
||
|
+ndr_print_debug: void (ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_debug_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_dlong: void (struct ndr_print *, const char *, int64_t)
|
||
|
+ndr_print_double: void (struct ndr_print *, const char *, double)
|
||
|
+ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t)
|
||
|
+ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *)
|
||
|
+ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *)
|
||
|
+ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *)
|
||
|
+ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t)
|
||
|
+ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_int16: void (struct ndr_print *, const char *, int16_t)
|
||
|
+ndr_print_int32: void (struct ndr_print *, const char *, int32_t)
|
||
|
+ndr_print_int3264: void (struct ndr_print *, const char *, int32_t)
|
||
|
+ndr_print_int8: void (struct ndr_print *, const char *, int8_t)
|
||
|
+ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *)
|
||
|
+ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID)
|
||
|
+ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType)
|
||
|
+ndr_print_null: void (struct ndr_print *)
|
||
|
+ndr_print_pointer: void (struct ndr_print *, const char *, void *)
|
||
|
+ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *)
|
||
|
+ndr_print_printf_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_ptr: void (struct ndr_print *, const char *, const void *)
|
||
|
+ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t)
|
||
|
+ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *)
|
||
|
+ndr_print_string: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_string_array: void (struct ndr_print *, const char *, const char **)
|
||
|
+ndr_print_string_helper: void (struct ndr_print *, const char *, ...)
|
||
|
+ndr_print_struct: void (struct ndr_print *, const char *, const char *)
|
||
|
+ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *)
|
||
|
+ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_time_t: void (struct ndr_print *, const char *, time_t)
|
||
|
+ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *)
|
||
|
+ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *)
|
||
|
+ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t)
|
||
|
+ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t)
|
||
|
+ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t)
|
||
|
+ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t)
|
||
|
+ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t)
|
||
|
+ndr_print_union: void (struct ndr_print *, const char *, int, const char *)
|
||
|
+ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *)
|
||
|
+ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *)
|
||
|
+ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *)
|
||
|
+ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type)
|
||
|
+ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *)
|
||
|
+ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *)
|
||
|
+ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *)
|
||
|
+ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *)
|
||
|
+ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *)
|
||
|
+ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t)
|
||
|
+ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_append: enum ndr_err_code (struct ndr_pull *, DATA_BLOB *)
|
||
|
+ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t)
|
||
|
+ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t)
|
||
|
+ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *)
|
||
|
+ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *)
|
||
|
+ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
|
||
|
+ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...)
|
||
|
+ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
|
||
|
+ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *)
|
||
|
+ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *)
|
||
|
+ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *)
|
||
|
+ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *)
|
||
|
+ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *)
|
||
|
+ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *)
|
||
|
+ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *)
|
||
|
+ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *)
|
||
|
+ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *)
|
||
|
+ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **)
|
||
|
+ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *)
|
||
|
+ndr_pull_pop: enum ndr_err_code (struct ndr_pull *)
|
||
|
+ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *)
|
||
|
+ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *)
|
||
|
+ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t)
|
||
|
+ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t)
|
||
|
+ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *)
|
||
|
+ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **)
|
||
|
+ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***)
|
||
|
+ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t)
|
||
|
+ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t)
|
||
|
+ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *)
|
||
|
+ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *)
|
||
|
+ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *)
|
||
|
+ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *)
|
||
|
+ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *)
|
||
|
+ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *)
|
||
|
+ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *)
|
||
|
+ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *)
|
||
|
+ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t)
|
||
|
+ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t)
|
||
|
+ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *)
|
||
|
+ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *)
|
||
|
+ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB)
|
||
|
+ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *)
|
||
|
+ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *)
|
||
|
+ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS)
|
||
|
+ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME)
|
||
|
+ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR)
|
||
|
+ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t)
|
||
|
+ndr_push_blob: DATA_BLOB (struct ndr_push *)
|
||
|
+ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t)
|
||
|
+ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t)
|
||
|
+ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t)
|
||
|
+ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double)
|
||
|
+ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
|
||
|
+ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...)
|
||
|
+ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t)
|
||
|
+ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *)
|
||
|
+ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *)
|
||
|
+ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t)
|
||
|
+ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *)
|
||
|
+ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t)
|
||
|
+ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t)
|
||
|
+ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t)
|
||
|
+ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *)
|
||
|
+ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID)
|
||
|
+ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType)
|
||
|
+ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *)
|
||
|
+ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *)
|
||
|
+ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *)
|
||
|
+ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t)
|
||
|
+ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
|
||
|
+ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t)
|
||
|
+ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *)
|
||
|
+ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **)
|
||
|
+ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t)
|
||
|
+ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t)
|
||
|
+ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t)
|
||
|
+ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t)
|
||
|
+ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *)
|
||
|
+ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *)
|
||
|
+ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t)
|
||
|
+ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t)
|
||
|
+ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t)
|
||
|
+ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t)
|
||
|
+ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t)
|
||
|
+ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t)
|
||
|
+ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t)
|
||
|
+ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *)
|
||
|
+ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *)
|
||
|
+ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type)
|
||
|
+ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t)
|
||
|
+ndr_set_flags: void (uint32_t *, uint32_t)
|
||
|
+ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int)
|
||
|
+ndr_size_GUID: size_t (const struct GUID *, int)
|
||
|
+ndr_size_string: uint32_t (int, const char * const *, int)
|
||
|
+ndr_size_string_array: size_t (const char **, uint32_t, int)
|
||
|
+ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t)
|
||
|
+ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t)
|
||
|
+ndr_string_array_size: size_t (struct ndr_push *, const char *)
|
||
|
+ndr_string_length: uint32_t (const void *, uint32_t)
|
||
|
+ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *)
|
||
|
+ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *)
|
||
|
+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
|
||
|
+ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *)
|
||
|
+ndr_token_peek: uint32_t (struct ndr_token_list **, const void *)
|
||
|
+ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *)
|
||
|
+ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list **, const void *, uint32_t *, comparison_fn_t, bool)
|
||
|
+ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list **, const void *, uint32_t)
|
||
|
+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
|
||
|
+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
|
||
|
--- a/librpc/ndr/ndr_misc.c
|
||
|
+++ b/librpc/ndr/ndr_misc.c
|
||
|
@@ -35,3 +35,50 @@ bool ndr_syntax_id_equal(const struct nd
|
||
|
return GUID_equal(&i1->uuid, &i2->uuid)
|
||
|
&& (i1->if_version == i2->if_version);
|
||
|
}
|
||
|
+
|
||
|
+_PUBLIC_ char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id)
|
||
|
+{
|
||
|
+ return talloc_asprintf(mem_ctx,
|
||
|
+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x",
|
||
|
+ id->uuid.time_low, id->uuid.time_mid,
|
||
|
+ id->uuid.time_hi_and_version,
|
||
|
+ id->uuid.clock_seq[0],
|
||
|
+ id->uuid.clock_seq[1],
|
||
|
+ id->uuid.node[0], id->uuid.node[1],
|
||
|
+ id->uuid.node[2], id->uuid.node[3],
|
||
|
+ id->uuid.node[4], id->uuid.node[5],
|
||
|
+ (unsigned)id->if_version);
|
||
|
+}
|
||
|
+
|
||
|
+_PUBLIC_ bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id)
|
||
|
+{
|
||
|
+ int ret;
|
||
|
+ size_t i;
|
||
|
+ uint32_t time_low;
|
||
|
+ uint32_t time_mid, time_hi_and_version;
|
||
|
+ uint32_t clock_seq[2];
|
||
|
+ uint32_t node[6];
|
||
|
+ uint32_t if_version;
|
||
|
+
|
||
|
+ ret = sscanf(s,
|
||
|
+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x",
|
||
|
+ &time_low, &time_mid, &time_hi_and_version,
|
||
|
+ &clock_seq[0], &clock_seq[1],
|
||
|
+ &node[0], &node[1], &node[2], &node[3], &node[4], &node[5],
|
||
|
+ &if_version);
|
||
|
+ if (ret != 12) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ id->uuid.time_low = time_low;
|
||
|
+ id->uuid.time_mid = time_mid;
|
||
|
+ id->uuid.time_hi_and_version = time_hi_and_version;
|
||
|
+ id->uuid.clock_seq[0] = clock_seq[0];
|
||
|
+ id->uuid.clock_seq[1] = clock_seq[1];
|
||
|
+ for (i=0; i<6; i++) {
|
||
|
+ id->uuid.node[i] = node[i];
|
||
|
+ }
|
||
|
+ id->if_version = if_version;
|
||
|
+
|
||
|
+ return true;
|
||
|
+}
|
||
|
--- a/librpc/rpc/dcerpc_util.c
|
||
|
+++ b/librpc/rpc/dcerpc_util.c
|
||
|
@@ -27,6 +27,7 @@
|
||
|
#include "librpc/rpc/dcerpc.h"
|
||
|
#include "librpc/gen_ndr/ndr_dcerpc.h"
|
||
|
#include "rpc_common.h"
|
||
|
+#include "lib/util/bitmap.h"
|
||
|
|
||
|
/* we need to be able to get/set the fragment length without doing a full
|
||
|
decode */
|
||
|
@@ -341,3 +342,194 @@ NTSTATUS dcerpc_read_ncacn_packet_recv(s
|
||
|
tevent_req_received(req);
|
||
|
return NT_STATUS_OK;
|
||
|
}
|
||
|
+
|
||
|
+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt)
|
||
|
+{
|
||
|
+ struct dcerpc_sec_vt_header2 ret;
|
||
|
+
|
||
|
+ ZERO_STRUCT(ret);
|
||
|
+ ret.ptype = pkt->ptype;
|
||
|
+ memcpy(&ret.drep, pkt->drep, sizeof(ret.drep));
|
||
|
+ ret.call_id = pkt->call_id;
|
||
|
+
|
||
|
+ switch (pkt->ptype) {
|
||
|
+ case DCERPC_PKT_REQUEST:
|
||
|
+ ret.context_id = pkt->u.request.context_id;
|
||
|
+ ret.opnum = pkt->u.request.opnum;
|
||
|
+ break;
|
||
|
+
|
||
|
+ case DCERPC_PKT_RESPONSE:
|
||
|
+ ret.context_id = pkt->u.response.context_id;
|
||
|
+ break;
|
||
|
+
|
||
|
+ case DCERPC_PKT_FAULT:
|
||
|
+ ret.context_id = pkt->u.fault.context_id;
|
||
|
+ break;
|
||
|
+
|
||
|
+ default:
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ return ret;
|
||
|
+}
|
||
|
+
|
||
|
+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
|
||
|
+ const struct dcerpc_sec_vt_header2 *v2)
|
||
|
+{
|
||
|
+ if (v1->ptype != v2->ptype) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (memcmp(v1->drep, v2->drep, sizeof(v1->drep)) != 0) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (v1->call_id != v2->call_id) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (v1->context_id != v2->context_id) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (v1->opnum != v2->opnum) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+}
|
||
|
+
|
||
|
+static bool dcerpc_sec_vt_is_valid(const struct dcerpc_sec_verification_trailer *r)
|
||
|
+{
|
||
|
+ bool ret = false;
|
||
|
+ TALLOC_CTX *frame = talloc_stackframe();
|
||
|
+ struct bitmap *commands_seen;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ if (r->count.count == 0) {
|
||
|
+ ret = true;
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (memcmp(r->magic, DCERPC_SEC_VT_MAGIC, sizeof(r->magic)) != 0) {
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+
|
||
|
+ commands_seen = bitmap_talloc(frame, DCERPC_SEC_VT_COMMAND_ENUM + 1);
|
||
|
+ if (commands_seen == NULL) {
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (i=0; i < r->count.count; i++) {
|
||
|
+ enum dcerpc_sec_vt_command_enum cmd =
|
||
|
+ r->commands[i].command & DCERPC_SEC_VT_COMMAND_ENUM;
|
||
|
+
|
||
|
+ if (bitmap_query(commands_seen, cmd)) {
|
||
|
+ /* Each command must appear at most once. */
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+ bitmap_set(commands_seen, cmd);
|
||
|
+
|
||
|
+ switch (cmd) {
|
||
|
+ case DCERPC_SEC_VT_COMMAND_BITMASK1:
|
||
|
+ case DCERPC_SEC_VT_COMMAND_PCONTEXT:
|
||
|
+ case DCERPC_SEC_VT_COMMAND_HEADER2:
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ if ((r->commands[i].u._unknown.length % 4) != 0) {
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ ret = true;
|
||
|
+done:
|
||
|
+ TALLOC_FREE(frame);
|
||
|
+ return ret;
|
||
|
+}
|
||
|
+
|
||
|
+#define CHECK(msg, ok) \
|
||
|
+do { \
|
||
|
+ if (!ok) { \
|
||
|
+ DEBUG(10, ("SEC_VT check %s failed\n", msg)); \
|
||
|
+ return false; \
|
||
|
+ } \
|
||
|
+} while(0)
|
||
|
+
|
||
|
+#define CHECK_SYNTAX(msg, s1, s2) \
|
||
|
+do { \
|
||
|
+ if (!ndr_syntax_id_equal(&s1, &s2)) { \
|
||
|
+ TALLOC_CTX *frame = talloc_stackframe(); \
|
||
|
+ DEBUG(10, ("SEC_VT check %s failed: %s vs. %s\n", msg, \
|
||
|
+ ndr_syntax_id_to_string(frame, &s1), \
|
||
|
+ ndr_syntax_id_to_string(frame, &s1))); \
|
||
|
+ TALLOC_FREE(frame); \
|
||
|
+ return false; \
|
||
|
+ } \
|
||
|
+} while(0)
|
||
|
+
|
||
|
+
|
||
|
+bool dcerpc_sec_verification_trailer_check(
|
||
|
+ const struct dcerpc_sec_verification_trailer *vt,
|
||
|
+ const uint32_t *bitmask1,
|
||
|
+ const struct dcerpc_sec_vt_pcontext *pcontext,
|
||
|
+ const struct dcerpc_sec_vt_header2 *header2)
|
||
|
+{
|
||
|
+ size_t i;
|
||
|
+
|
||
|
+ if (!dcerpc_sec_vt_is_valid(vt)) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (i=0; i < vt->count.count; i++) {
|
||
|
+ struct dcerpc_sec_vt *c = &vt->commands[i];
|
||
|
+
|
||
|
+ switch (c->command & DCERPC_SEC_VT_COMMAND_ENUM) {
|
||
|
+ case DCERPC_SEC_VT_COMMAND_BITMASK1:
|
||
|
+ if (bitmask1 == NULL) {
|
||
|
+ CHECK("Bitmask1 must_process_command",
|
||
|
+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (c->u.bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING) {
|
||
|
+ CHECK("Bitmask1 client_header_signing",
|
||
|
+ *bitmask1 & DCERPC_SEC_VT_CLIENT_SUPPORTS_HEADER_SIGNING);
|
||
|
+ }
|
||
|
+ break;
|
||
|
+
|
||
|
+ case DCERPC_SEC_VT_COMMAND_PCONTEXT:
|
||
|
+ if (pcontext == NULL) {
|
||
|
+ CHECK("Pcontext must_process_command",
|
||
|
+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ CHECK_SYNTAX("Pcontect abstract_syntax",
|
||
|
+ pcontext->abstract_syntax,
|
||
|
+ c->u.pcontext.abstract_syntax);
|
||
|
+ CHECK_SYNTAX("Pcontext transfer_syntax",
|
||
|
+ pcontext->transfer_syntax,
|
||
|
+ c->u.pcontext.transfer_syntax);
|
||
|
+ break;
|
||
|
+
|
||
|
+ case DCERPC_SEC_VT_COMMAND_HEADER2: {
|
||
|
+ if (header2 == NULL) {
|
||
|
+ CHECK("Header2 must_process_command",
|
||
|
+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ CHECK("Header2", dcerpc_sec_vt_header2_equal(header2, &c->u.header2));
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ default:
|
||
|
+ CHECK("Unknown must_process_command",
|
||
|
+ !(c->command & DCERPC_SEC_VT_MUST_PROCESS));
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+}
|
||
|
--- a/librpc/rpc/rpc_common.h
|
||
|
+++ b/librpc/rpc/rpc_common.h
|
||
|
@@ -296,4 +296,45 @@ NTSTATUS dcerpc_binding_handle_call(stru
|
||
|
TALLOC_CTX *r_mem,
|
||
|
void *r_ptr);
|
||
|
|
||
|
+/**
|
||
|
+ * Extract header information from a ncacn_packet
|
||
|
+ * as a dcerpc_sec_vt_header2 as used by the security verification trailer.
|
||
|
+ *
|
||
|
+ * @param[in] pkt a packet
|
||
|
+ *
|
||
|
+ * @return a dcerpc_sec_vt_header2
|
||
|
+ */
|
||
|
+struct dcerpc_sec_vt_header2 dcerpc_sec_vt_header2_from_ncacn_packet(const struct ncacn_packet *pkt);
|
||
|
+
|
||
|
+
|
||
|
+/**
|
||
|
+ * Test if two dcerpc_sec_vt_header2 structures are equal
|
||
|
+ * without consideration of reserved fields.
|
||
|
+ *
|
||
|
+ * @param v1 a pointer to a dcerpc_sec_vt_header2 structure
|
||
|
+ * @param v2 a pointer to a dcerpc_sec_vt_header2 structure
|
||
|
+ *
|
||
|
+ * @retval true if *v1 equals *v2
|
||
|
+ */
|
||
|
+bool dcerpc_sec_vt_header2_equal(const struct dcerpc_sec_vt_header2 *v1,
|
||
|
+ const struct dcerpc_sec_vt_header2 *v2);
|
||
|
+
|
||
|
+/**
|
||
|
+ * Check for consistency of the security verification trailer with the PDU header.
|
||
|
+ * See <a href="http://msdn.microsoft.com/en-us/library/cc243559.aspx">MS-RPCE 2.2.2.13</a>.
|
||
|
+ * A check with an empty trailer succeeds.
|
||
|
+ *
|
||
|
+ * @param[in] vt a pointer to the security verification trailer.
|
||
|
+ * @param[in] bitmask1 which flags were negotiated on the connection.
|
||
|
+ * @param[in] pcontext the syntaxes negotiatied for the presentation context.
|
||
|
+ * @param[in] header2 some fields from the PDU header.
|
||
|
+ *
|
||
|
+ * @retval true on success.
|
||
|
+ */
|
||
|
+bool dcerpc_sec_verification_trailer_check(
|
||
|
+ const struct dcerpc_sec_verification_trailer *vt,
|
||
|
+ const uint32_t *bitmask1,
|
||
|
+ const struct dcerpc_sec_vt_pcontext *pcontext,
|
||
|
+ const struct dcerpc_sec_vt_header2 *header2);
|
||
|
+
|
||
|
#endif /* __DEFAULT_LIBRPC_RPCCOMMON_H__ */
|
||
|
--- a/source4/torture/ndr/ndr.c
|
||
|
+++ b/source4/torture/ndr/ndr.c
|
||
|
@@ -29,40 +29,65 @@ struct ndr_pull_test_data {
|
||
|
DATA_BLOB data_context;
|
||
|
size_t struct_size;
|
||
|
ndr_pull_flags_fn_t pull_fn;
|
||
|
+ ndr_push_flags_fn_t push_fn;
|
||
|
int ndr_flags;
|
||
|
+ int flags;
|
||
|
};
|
||
|
|
||
|
-static bool wrap_ndr_pull_test(struct torture_context *tctx,
|
||
|
- struct torture_tcase *tcase,
|
||
|
- struct torture_test *test)
|
||
|
+static bool wrap_ndr_pullpush_test(struct torture_context *tctx,
|
||
|
+ struct torture_tcase *tcase,
|
||
|
+ struct torture_test *test)
|
||
|
{
|
||
|
bool (*check_fn) (struct torture_context *ctx, void *data) = test->fn;
|
||
|
const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data;
|
||
|
- void *ds = talloc_zero_size(tctx, data->struct_size);
|
||
|
struct ndr_pull *ndr = ndr_pull_init_blob(&(data->data), tctx);
|
||
|
+ void *ds = talloc_zero_size(ndr, data->struct_size);
|
||
|
+ bool ret;
|
||
|
+ uint32_t highest_ofs;
|
||
|
+
|
||
|
+ ndr->flags |= data->flags;
|
||
|
|
||
|
ndr->flags |= LIBNDR_FLAG_REF_ALLOC;
|
||
|
|
||
|
torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds),
|
||
|
"pulling");
|
||
|
|
||
|
- torture_assert(tctx, ndr->offset == ndr->data_size,
|
||
|
+ if (ndr->offset > ndr->relative_highest_offset) {
|
||
|
+ highest_ofs = ndr->offset;
|
||
|
+ } else {
|
||
|
+ highest_ofs = ndr->relative_highest_offset;
|
||
|
+ }
|
||
|
+
|
||
|
+ torture_assert(tctx, highest_ofs == ndr->data_size,
|
||
|
talloc_asprintf(tctx,
|
||
|
- "%d unread bytes", ndr->data_size - ndr->offset));
|
||
|
+ "%d unread bytes", ndr->data_size - highest_ofs));
|
||
|
|
||
|
- if (check_fn != NULL)
|
||
|
- return check_fn(tctx, ds);
|
||
|
- else
|
||
|
- return true;
|
||
|
+ if (check_fn != NULL) {
|
||
|
+ ret = check_fn(tctx, ds);
|
||
|
+ } else {
|
||
|
+ ret = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (data->push_fn != NULL) {
|
||
|
+ DATA_BLOB outblob;
|
||
|
+ torture_assert_ndr_success(tctx, ndr_push_struct_blob(&outblob, ndr, ds, data->push_fn), "pushing");
|
||
|
+ torture_assert_data_blob_equal(tctx, outblob, data->data, "ndr push compare");
|
||
|
+ }
|
||
|
+
|
||
|
+ talloc_free(ndr);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test(
|
||
|
- struct torture_suite *suite,
|
||
|
- const char *name, ndr_pull_flags_fn_t pull_fn,
|
||
|
- DATA_BLOB db,
|
||
|
- size_t struct_size,
|
||
|
- int ndr_flags,
|
||
|
- bool (*check_fn) (struct torture_context *ctx, void *data))
|
||
|
+_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test(
|
||
|
+ struct torture_suite *suite,
|
||
|
+ const char *name,
|
||
|
+ ndr_pull_flags_fn_t pull_fn,
|
||
|
+ ndr_push_flags_fn_t push_fn,
|
||
|
+ DATA_BLOB db,
|
||
|
+ size_t struct_size,
|
||
|
+ int ndr_flags,
|
||
|
+ int flags,
|
||
|
+ bool (*check_fn) (struct torture_context *ctx, void *data))
|
||
|
{
|
||
|
struct torture_test *test;
|
||
|
struct torture_tcase *tcase;
|
||
|
@@ -74,12 +99,16 @@ _PUBLIC_ struct torture_test *_torture_s
|
||
|
|
||
|
test->name = talloc_strdup(test, name);
|
||
|
test->description = NULL;
|
||
|
- test->run = wrap_ndr_pull_test;
|
||
|
+ test->run = wrap_ndr_pullpush_test;
|
||
|
+
|
||
|
data = talloc(test, struct ndr_pull_test_data);
|
||
|
data->data = db;
|
||
|
data->ndr_flags = ndr_flags;
|
||
|
+ data->flags = flags;
|
||
|
data->struct_size = struct_size;
|
||
|
data->pull_fn = pull_fn;
|
||
|
+ data->push_fn = push_fn;
|
||
|
+
|
||
|
test->data = data;
|
||
|
test->fn = check_fn;
|
||
|
test->dangerous = false;
|
||
|
@@ -89,6 +118,7 @@ _PUBLIC_ struct torture_test *_torture_s
|
||
|
return test;
|
||
|
}
|
||
|
|
||
|
+
|
||
|
static bool wrap_ndr_inout_pull_test(struct torture_context *tctx,
|
||
|
struct torture_tcase *tcase,
|
||
|
struct torture_test *test)
|
||
|
@@ -97,6 +127,7 @@ static bool wrap_ndr_inout_pull_test(str
|
||
|
const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data;
|
||
|
void *ds = talloc_zero_size(tctx, data->struct_size);
|
||
|
struct ndr_pull *ndr;
|
||
|
+ uint32_t highest_ofs;
|
||
|
|
||
|
/* handle NDR_IN context */
|
||
|
|
||
|
@@ -109,8 +140,14 @@ static bool wrap_ndr_inout_pull_test(str
|
||
|
data->pull_fn(ndr, NDR_IN, ds),
|
||
|
"ndr pull of context failed");
|
||
|
|
||
|
- torture_assert(tctx, ndr->offset == ndr->data_size,
|
||
|
- talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset));
|
||
|
+ if (ndr->offset > ndr->relative_highest_offset) {
|
||
|
+ highest_ofs = ndr->offset;
|
||
|
+ } else {
|
||
|
+ highest_ofs = ndr->relative_highest_offset;
|
||
|
+ }
|
||
|
+
|
||
|
+ torture_assert(tctx, highest_ofs == ndr->data_size,
|
||
|
+ talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs));
|
||
|
|
||
|
talloc_free(ndr);
|
||
|
|
||
|
@@ -125,8 +162,14 @@ static bool wrap_ndr_inout_pull_test(str
|
||
|
data->pull_fn(ndr, NDR_OUT, ds),
|
||
|
"ndr pull failed");
|
||
|
|
||
|
- torture_assert(tctx, ndr->offset == ndr->data_size,
|
||
|
- talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - ndr->offset));
|
||
|
+ if (ndr->offset > ndr->relative_highest_offset) {
|
||
|
+ highest_ofs = ndr->offset;
|
||
|
+ } else {
|
||
|
+ highest_ofs = ndr->relative_highest_offset;
|
||
|
+ }
|
||
|
+
|
||
|
+ torture_assert(tctx, highest_ofs == ndr->data_size,
|
||
|
+ talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs));
|
||
|
|
||
|
talloc_free(ndr);
|
||
|
|
||
|
--- a/source4/torture/ndr/ndr.h
|
||
|
+++ b/source4/torture/ndr/ndr.h
|
||
|
@@ -24,12 +24,15 @@
|
||
|
#include "librpc/ndr/libndr.h"
|
||
|
#include "libcli/security/security.h"
|
||
|
|
||
|
-_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_test(
|
||
|
+_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test(
|
||
|
struct torture_suite *suite,
|
||
|
- const char *name, ndr_pull_flags_fn_t fn,
|
||
|
+ const char *name,
|
||
|
+ ndr_pull_flags_fn_t pull_fn,
|
||
|
+ ndr_push_flags_fn_t push_fn,
|
||
|
DATA_BLOB db,
|
||
|
size_t struct_size,
|
||
|
int ndr_flags,
|
||
|
+ int flags,
|
||
|
bool (*check_fn) (struct torture_context *, void *data));
|
||
|
|
||
|
_PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test(
|
||
|
@@ -41,20 +44,32 @@ _PUBLIC_ struct torture_test *_torture_s
|
||
|
bool (*check_fn) (struct torture_context *ctx, void *data));
|
||
|
|
||
|
#define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \
|
||
|
- _torture_suite_add_ndr_pull_test(suite, #name, \
|
||
|
- (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \
|
||
|
- sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
+ _torture_suite_add_ndr_pullpush_test(suite, #name, \
|
||
|
+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
|
||
|
+ sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
|
||
|
#define torture_suite_add_ndr_pull_fn_test(suite,name,data,flags,check_fn) \
|
||
|
- _torture_suite_add_ndr_pull_test(suite, #name "_" #flags, \
|
||
|
- (ndr_pull_flags_fn_t)ndr_pull_ ## name, data_blob_talloc(suite, data, sizeof(data)), \
|
||
|
- sizeof(struct name), flags, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
+ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \
|
||
|
+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
|
||
|
+ sizeof(struct name), flags, 0, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
+
|
||
|
+#define torture_suite_add_ndr_pull_fn_test_flags(suite,name,data,flags,flags2,check_fn) \
|
||
|
+ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \
|
||
|
+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \
|
||
|
+ sizeof(struct name), flags, flags2, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
+
|
||
|
+#define torture_suite_add_ndr_pullpush_test(suite,name,data_blob,check_fn) \
|
||
|
+ _torture_suite_add_ndr_pullpush_test(suite, #name, \
|
||
|
+ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \
|
||
|
+ (ndr_push_flags_fn_t)ndr_push_ ## name, \
|
||
|
+ data_blob, \
|
||
|
+ sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn);
|
||
|
|
||
|
#define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \
|
||
|
_torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \
|
||
|
(ndr_pull_flags_fn_t)ndr_pull_ ## name, \
|
||
|
- data_blob_talloc(suite, data_in, sizeof(data_in)), \
|
||
|
- data_blob_talloc(suite, data_out, sizeof(data_out)), \
|
||
|
+ data_blob_const(data_in, sizeof(data_in)), \
|
||
|
+ data_blob_const(data_out, sizeof(data_out)), \
|
||
|
sizeof(struct name), \
|
||
|
(bool (*) (struct torture_context *, void *)) check_fn_out);
|
||
|
|
||
|
--- a/source4/torture/ndr/dfsblob.c
|
||
|
+++ b/source4/torture/ndr/dfsblob.c
|
||
|
@@ -74,11 +74,11 @@ struct torture_suite *ndr_dfsblob_suite(
|
||
|
{
|
||
|
struct torture_suite *suite = torture_suite_create(ctx, "dfsblob");
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NDR_IN, NULL);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, dfs_GetDFSReferral_in, dfs_get_ref_in, NULL);
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out2, NDR_BUFFERS|NDR_SCALARS, NULL);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out2, NULL);
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, dfs_referral_resp, dfs_get_ref_out, NDR_BUFFERS|NDR_SCALARS,dfs_referral_out_check);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, dfs_referral_resp, dfs_get_ref_out,dfs_referral_out_check);
|
||
|
|
||
|
return suite;
|
||
|
}
|
||
|
--- a/source4/torture/ndr/nbt.c
|
||
|
+++ b/source4/torture/ndr/nbt.c
|
||
|
@@ -62,9 +62,9 @@ struct torture_suite *ndr_nbt_suite(TALL
|
||
|
{
|
||
|
struct torture_suite *suite = torture_suite_create(ctx, "nbt");
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, NDR_IN, netlogon_logon_request_req_check);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, nbt_netlogon_packet, netlogon_logon_request_req_data, netlogon_logon_request_req_check);
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, NDR_IN, netlogon_logon_request_resp_check);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, nbt_netlogon_response2, netlogon_logon_request_resp_data, netlogon_logon_request_resp_check);
|
||
|
|
||
|
return suite;
|
||
|
}
|
||
|
--- a/source4/torture/ndr/ntlmssp.c
|
||
|
+++ b/source4/torture/ndr/ntlmssp.c
|
||
|
@@ -111,9 +111,10 @@ struct torture_suite *ndr_ntlmssp_suite(
|
||
|
{
|
||
|
struct torture_suite *suite = torture_suite_create(ctx, "ntlmssp");
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, NDR_IN, ntlmssp_NEGOTIATE_MESSAGE_check);
|
||
|
- /* torture_suite_add_ndr_pull_fn_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, NDR_IN, ntlmssp_CHALLENGE_MESSAGE_check);
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, NDR_IN, ntlmssp_AUTHENTICATE_MESSAGE_check); */
|
||
|
-
|
||
|
+ torture_suite_add_ndr_pull_test(suite, NEGOTIATE_MESSAGE, ntlmssp_NEGOTIATE_MESSAGE_data, ntlmssp_NEGOTIATE_MESSAGE_check);
|
||
|
+#if 0
|
||
|
+ torture_suite_add_ndr_pull_test(suite, CHALLENGE_MESSAGE, ntlmssp_CHALLENGE_MESSAGE_data, ntlmssp_CHALLENGE_MESSAGE_check);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, AUTHENTICATE_MESSAGE, ntlmssp_AUTHENTICATE_MESSAGE_data, ntlmssp_AUTHENTICATE_MESSAGE_check);
|
||
|
+#endif
|
||
|
return suite;
|
||
|
}
|
||
|
--- a/source4/torture/ndr/drsblobs.c
|
||
|
+++ b/source4/torture/ndr/drsblobs.c
|
||
|
@@ -115,6 +115,34 @@ static const uint8_t trust_domain_passwo
|
||
|
0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00
|
||
|
};
|
||
|
|
||
|
+/* these are taken from the trust objects of a w2k8r2 forest, with a
|
||
|
+ * trust relationship between the forest parent and a child domain
|
||
|
+ */
|
||
|
+static const char *trustAuthIncoming =
|
||
|
+"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H"
|
||
|
+"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+"
|
||
|
+"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ"
|
||
|
+"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/"
|
||
|
+"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3"
|
||
|
+"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu"
|
||
|
+"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF"
|
||
|
+"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ"
|
||
|
+"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7"
|
||
|
+"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA==";
|
||
|
+
|
||
|
+static const char *trustAuthOutgoing =
|
||
|
+"AQAAAAwAAAAcAQAASuQ+RXJdzAECAAAAAAEAAMOWL6UVfVKiJOUsGcT03H"
|
||
|
+"jHxr2ACsMMOV5ynM617Tp7idNC+c4egdqk4S9YEpvR2YvHmdZdymL6F7QKm8OkXazYZF2r/gZ/bI+"
|
||
|
+"jkWbsn4O8qyAc3OUKQRZwBbf+lxBW+vM4O3ZpUjz5BSKCcFQgM+MY91yVU8Nji3HNnvGnDquobFAZ"
|
||
|
+"hxjL+S1l5+QZgkfyfv5mQScGRbU1Lar1xg9G3JznUb7S6pvrBO2nwK8g+KZBfJy5UeULigDH4IWo/"
|
||
|
+"JmtaEGkKE2uiKIjdsEQd/uwnkouW26XzRc0ulfJnPFftGnT9KIcShPf7DLj/tstmQAAceRMFHJTY3"
|
||
|
+"PmxoowoK8HUyBK5D5Fcl3MAQIAAAAAAQAAw5YvpRV9UqIk5SwZxPTceMfGvYAKwww5XnKczrXtOnu"
|
||
|
+"J00L5zh6B2qThL1gSm9HZi8eZ1l3KYvoXtAqbw6RdrNhkXav+Bn9sj6ORZuyfg7yrIBzc5QpBFnAF"
|
||
|
+"t/6XEFb68zg7dmlSPPkFIoJwVCAz4xj3XJVTw2OLcc2e8acOq6hsUBmHGMv5LWXn5BmCR/J+/mZBJ"
|
||
|
+"wZFtTUtqvXGD0bcnOdRvtLqm+sE7afAryD4pkF8nLlR5QuKAMfghaj8ma1oQaQoTa6IoiN2wRB3+7"
|
||
|
+"CeSi5bbpfNFzS6V8mc8V+0adP0ohxKE9/sMuP+2y2ZAABx5EwUclNjc+bGijCgrwdTIA==";
|
||
|
+
|
||
|
+
|
||
|
static bool trust_domain_passwords_check_in(struct torture_context *tctx,
|
||
|
struct trustDomainPasswords *r)
|
||
|
{
|
||
|
@@ -154,8 +182,20 @@ struct torture_suite *ndr_drsblobs_suite
|
||
|
{
|
||
|
struct torture_suite *suite = torture_suite_create(ctx, "drsblobs");
|
||
|
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, ForestTrustInfo, forest_trust_info_data_out, NDR_IN, forest_trust_info_check_out);
|
||
|
- torture_suite_add_ndr_pull_fn_test(suite, trustDomainPasswords, trust_domain_passwords_in, NDR_IN, trust_domain_passwords_check_in);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, ForestTrustInfo, forest_trust_info_data_out, forest_trust_info_check_out);
|
||
|
+ torture_suite_add_ndr_pull_test(suite, trustDomainPasswords, trust_domain_passwords_in, trust_domain_passwords_check_in);
|
||
|
+
|
||
|
+#if 0
|
||
|
+ torture_suite_add_ndr_pullpush_test(suite,
|
||
|
+ trustAuthInOutBlob,
|
||
|
+ base64_decode_data_blob_talloc(suite, trustAuthIncoming),
|
||
|
+ NULL);
|
||
|
+
|
||
|
+ torture_suite_add_ndr_pullpush_test(suite,
|
||
|
+ trustAuthInOutBlob,
|
||
|
+ base64_decode_data_blob_talloc(suite, trustAuthOutgoing),
|
||
|
+ NULL);
|
||
|
+#endif
|
||
|
|
||
|
return suite;
|
||
|
}
|
||
|
--- a/source3/rpcclient/rpcclient.c
|
||
|
+++ b/source3/rpcclient/rpcclient.c
|
||
|
@@ -1031,6 +1031,10 @@ out_free:
|
||
|
binding->transport = NCACN_NP;
|
||
|
}
|
||
|
|
||
|
+ if (binding->flags & DCERPC_CONNECT) {
|
||
|
+ pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
|
||
|
+ pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
|
||
|
+ }
|
||
|
if (binding->flags & DCERPC_SIGN) {
|
||
|
pipe_default_auth_level = DCERPC_AUTH_LEVEL_INTEGRITY;
|
||
|
pipe_default_auth_type = DCERPC_AUTH_TYPE_NTLMSSP;
|
||
|
@@ -1044,12 +1048,6 @@ out_free:
|
||
|
pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;
|
||
|
}
|
||
|
if (binding->flags & DCERPC_AUTH_NTLM) {
|
||
|
- /* If neither Integrity or Privacy are requested then
|
||
|
- * Use just Connect level */
|
||
|
- if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
|
||
|
- pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
|
||
|
- }
|
||
|
-
|
||
|
if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) {
|
||
|
pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_NTLMSSP;
|
||
|
} else {
|
||
|
@@ -1057,18 +1055,19 @@ out_free:
|
||
|
}
|
||
|
}
|
||
|
if (binding->flags & DCERPC_AUTH_KRB5) {
|
||
|
- /* If neither Integrity or Privacy are requested then
|
||
|
- * Use just Connect level */
|
||
|
- if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
|
||
|
- pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
|
||
|
- }
|
||
|
-
|
||
|
if (pipe_default_auth_type == DCERPC_AUTH_TYPE_SPNEGO) {
|
||
|
pipe_default_auth_spnego_type = PIPE_AUTH_TYPE_SPNEGO_KRB5;
|
||
|
} else {
|
||
|
pipe_default_auth_type = DCERPC_AUTH_TYPE_KRB5;
|
||
|
}
|
||
|
}
|
||
|
+ if (pipe_default_auth_type != DCERPC_AUTH_TYPE_NONE) {
|
||
|
+ /* If neither Integrity or Privacy are requested then
|
||
|
+ * Use just Connect level */
|
||
|
+ if (pipe_default_auth_level == DCERPC_AUTH_LEVEL_NONE) {
|
||
|
+ pipe_default_auth_level = DCERPC_AUTH_LEVEL_CONNECT;
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
if (get_cmdline_auth_info_use_kerberos(rpcclient_auth_info)) {
|
||
|
flags |= CLI_FULL_CONNECTION_USE_KERBEROS |
|
||
|
--- /dev/null
|
||
|
+++ b/source3/script/tests/test_rpcclient.sh
|
||
|
@@ -0,0 +1,19 @@
|
||
|
+#!/bin/sh
|
||
|
+
|
||
|
+if [ $# -lt 1 ]; then
|
||
|
+cat <<EOF
|
||
|
+Usage: test_rpcclient.sh ccache binding <rpcclient commands>
|
||
|
+EOF
|
||
|
+exit 1;
|
||
|
+fi
|
||
|
+
|
||
|
+KRB5CCNAME=$1
|
||
|
+shift 1
|
||
|
+export KRB5CCNAME
|
||
|
+ADDARGS="$*"
|
||
|
+
|
||
|
+incdir=`dirname $0`/../../../testprogs/blackbox
|
||
|
+. $incdir/subunit.sh
|
||
|
+testit "rpcclient" $VALGRIND $BINDIR/rpcclient -c 'getusername' $ADDARGS || failed=`expr $failed + 1`
|
||
|
+
|
||
|
+testok $0 $failed
|
||
|
--- a/source3/selftest/tests.py
|
||
|
+++ b/source3/selftest/tests.py
|
||
|
@@ -208,7 +208,7 @@ if sub.returncode == 0:
|
||
|
plansmbtorturetestsuite(t, "s3dc", '//$SERVER_IP/tmpcase -U$USERNAME%$PASSWORD')
|
||
|
|
||
|
test = 'rpc.lsa.lookupsids'
|
||
|
- auth_options = ["", "ntlm", "spnego" ]
|
||
|
+ auth_options = ["", "ntlm", "spnego", "spnego,ntlm" ]
|
||
|
signseal_options = ["", ",connect", ",sign", ",seal"]
|
||
|
smb_options = ["", ",smb2"]
|
||
|
endianness_options = ["", ",bigendian"]
|
||
|
@@ -219,6 +219,9 @@ if sub.returncode == 0:
|
||
|
binding_string = "ncacn_np:$SERVER_IP[%s%s%s%s]" % (a, s, z, e)
|
||
|
options = binding_string + " -U$USERNAME%$PASSWORD"
|
||
|
plansmbtorturetestsuite(test, "s3dc", options, 'over ncacn_np with [%s%s%s%s] ' % (a, s, z, e))
|
||
|
+ 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"),
|
||
|
+ "none", options, configuration])
|
||
|
+
|
||
|
for e in endianness_options:
|
||
|
for a in auth_options:
|
||
|
for s in signseal_options:
|
||
|
--- a/source4/torture/rpc/rpc.c
|
||
|
+++ b/source4/torture/rpc/rpc.c
|
||
|
@@ -501,6 +501,7 @@ NTSTATUS torture_rpc_init(void)
|
||
|
torture_suite_add_suite(suite, torture_rpc_samr_passwords_pwdlastset(suite));
|
||
|
torture_suite_add_suite(suite, torture_rpc_samr_passwords_badpwdcount(suite));
|
||
|
torture_suite_add_suite(suite, torture_rpc_samr_passwords_lockout(suite));
|
||
|
+ torture_suite_add_suite(suite, torture_rpc_samr_passwords_validate(suite));
|
||
|
torture_suite_add_suite(suite, torture_rpc_samr_user_privileges(suite));
|
||
|
torture_suite_add_suite(suite, torture_rpc_samr_large_dc(suite));
|
||
|
torture_suite_add_suite(suite, torture_rpc_epmapper(suite));
|
||
|
--- a/source4/torture/rpc/samr.c
|
||
|
+++ b/source4/torture/rpc/samr.c
|
||
|
@@ -7938,8 +7938,8 @@ static bool test_Connect(struct dcerpc_b
|
||
|
}
|
||
|
|
||
|
|
||
|
-static bool test_samr_ValidatePassword(struct dcerpc_pipe *p,
|
||
|
- struct torture_context *tctx)
|
||
|
+static bool test_samr_ValidatePassword(struct torture_context *tctx,
|
||
|
+ struct dcerpc_pipe *p)
|
||
|
{
|
||
|
struct samr_ValidatePassword r;
|
||
|
union samr_ValidatePasswordReq req;
|
||
|
@@ -7951,6 +7951,10 @@ static bool test_samr_ValidatePassword(s
|
||
|
|
||
|
torture_comment(tctx, "Testing samr_ValidatePassword\n");
|
||
|
|
||
|
+ if (p->conn->transport.transport != NCACN_IP_TCP) {
|
||
|
+ torture_comment(tctx, "samr_ValidatePassword only should succeed over NCACN_IP_TCP!\n");
|
||
|
+ }
|
||
|
+
|
||
|
ZERO_STRUCT(r);
|
||
|
r.in.level = NetValidatePasswordReset;
|
||
|
r.in.req = &req;
|
||
|
@@ -8074,8 +8078,6 @@ bool torture_rpc_samr_passwords(struct t
|
||
|
|
||
|
ret &= test_samr_handle_Close(b, torture, &ctx->handle);
|
||
|
|
||
|
- ret &= test_samr_ValidatePassword(p, torture);
|
||
|
-
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
@@ -8370,4 +8372,15 @@ struct torture_suite *torture_rpc_samr_p
|
||
|
return suite;
|
||
|
}
|
||
|
|
||
|
+struct torture_suite *torture_rpc_samr_passwords_validate(TALLOC_CTX *mem_ctx)
|
||
|
+{
|
||
|
+ struct torture_suite *suite = torture_suite_create(mem_ctx, "samr.passwords.validate");
|
||
|
+ struct torture_rpc_tcase *tcase;
|
||
|
+
|
||
|
+ tcase = torture_suite_add_rpc_iface_tcase(suite, "samr",
|
||
|
+ &ndr_table_samr);
|
||
|
+ torture_rpc_tcase_add_test(tcase, "validate",
|
||
|
+ test_samr_ValidatePassword);
|
||
|
|
||
|
+ return suite;
|
||
|
+}
|
||
|
--- a/source3/rpc_server/srv_pipe.c
|
||
|
+++ b/source3/rpc_server/srv_pipe.c
|
||
|
@@ -42,6 +42,7 @@
|
||
|
#include "auth.h"
|
||
|
#include "ntdomain.h"
|
||
|
#include "rpc_server/srv_pipe.h"
|
||
|
+#include "../librpc/ndr/ndr_dcerpc.h"
|
||
|
|
||
|
#undef DBGC_CLASS
|
||
|
#define DBGC_CLASS DBGC_RPC_SRV
|
||
|
@@ -202,7 +203,7 @@ bool create_next_pdu(struct pipes_struct
|
||
|
* the pipe gets closed. JRA.
|
||
|
*/
|
||
|
if (p->fault_state) {
|
||
|
- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
|
||
|
+ setup_fault_pdu(p, NT_STATUS(p->fault_state));
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@@ -336,7 +337,7 @@ static bool check_bind_req(struct pipes_
|
||
|
struct pipe_rpc_fns *context_fns;
|
||
|
|
||
|
DEBUG(3,("check_bind_req for %s\n",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), abstract)));
|
||
|
|
||
|
/* we have to check all now since win2k introduced a new UUID on the lsaprpc pipe */
|
||
|
if (rpc_srv_pipe_exists_by_id(abstract) &&
|
||
|
@@ -358,6 +359,7 @@ static bool check_bind_req(struct pipes_
|
||
|
context_fns->n_cmds = rpc_srv_get_pipe_num_cmds(abstract);
|
||
|
context_fns->cmds = rpc_srv_get_pipe_cmds(abstract);
|
||
|
context_fns->context_id = context_id;
|
||
|
+ context_fns->syntax = *abstract;
|
||
|
|
||
|
/* add to the list of open contexts */
|
||
|
|
||
|
@@ -1541,7 +1543,42 @@ static PIPE_RPC_FNS* find_pipe_fns_by_co
|
||
|
}
|
||
|
|
||
|
static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt,
|
||
|
- const struct api_struct *api_rpc_cmds, int n_cmds);
|
||
|
+ const struct api_struct *api_rpc_cmds, int n_cmds,
|
||
|
+ const struct ndr_syntax_id *syntax);
|
||
|
+
|
||
|
+static bool srv_pipe_check_verification_trailer(struct pipes_struct *p,
|
||
|
+ struct ncacn_packet *pkt,
|
||
|
+ struct pipe_rpc_fns *pipe_fns)
|
||
|
+{
|
||
|
+ TALLOC_CTX *frame = talloc_stackframe();
|
||
|
+ struct dcerpc_sec_verification_trailer *vt = NULL;
|
||
|
+ const uint32_t bitmask1 = 0;
|
||
|
+ const struct dcerpc_sec_vt_pcontext pcontext = {
|
||
|
+ .abstract_syntax = pipe_fns->syntax,
|
||
|
+ .transfer_syntax = ndr_transfer_syntax,
|
||
|
+ };
|
||
|
+ const struct dcerpc_sec_vt_header2 header2 =
|
||
|
+ dcerpc_sec_vt_header2_from_ncacn_packet(pkt);
|
||
|
+ struct ndr_pull *ndr;
|
||
|
+ enum ndr_err_code ndr_err;
|
||
|
+ bool ret = false;
|
||
|
+
|
||
|
+ ndr = ndr_pull_init_blob(&p->in_data.data, frame);
|
||
|
+ if (ndr == NULL) {
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+
|
||
|
+ ndr_err = ndr_pop_dcerpc_sec_verification_trailer(ndr, frame, &vt);
|
||
|
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
|
||
|
+ goto done;
|
||
|
+ }
|
||
|
+
|
||
|
+ ret = dcerpc_sec_verification_trailer_check(vt, &bitmask1,
|
||
|
+ &pcontext, &header2);
|
||
|
+done:
|
||
|
+ TALLOC_FREE(frame);
|
||
|
+ return ret;
|
||
|
+}
|
||
|
|
||
|
/****************************************************************************
|
||
|
Find the correct RPC function to call for this request.
|
||
|
@@ -1552,46 +1589,53 @@ static bool api_rpcTNP(struct pipes_stru
|
||
|
static bool api_pipe_request(struct pipes_struct *p,
|
||
|
struct ncacn_packet *pkt)
|
||
|
{
|
||
|
+ TALLOC_CTX *frame = talloc_stackframe();
|
||
|
bool ret = False;
|
||
|
- bool changed_user = False;
|
||
|
PIPE_RPC_FNS *pipe_fns;
|
||
|
|
||
|
- if (p->pipe_bound &&
|
||
|
- ((p->auth.auth_type == DCERPC_AUTH_TYPE_NTLMSSP) ||
|
||
|
- (p->auth.auth_type == DCERPC_AUTH_TYPE_KRB5) ||
|
||
|
- (p->auth.auth_type == DCERPC_AUTH_TYPE_SPNEGO))) {
|
||
|
- if(!become_authenticated_pipe_user(p->session_info)) {
|
||
|
- data_blob_free(&p->out_data.rdata);
|
||
|
- return False;
|
||
|
- }
|
||
|
- changed_user = True;
|
||
|
+ if (!p->pipe_bound) {
|
||
|
+ DEBUG(1, ("Pipe not bound!\n"));
|
||
|
+ data_blob_free(&p->out_data.rdata);
|
||
|
+ TALLOC_FREE(frame);
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
- DEBUG(5, ("Requested \\PIPE\\%s\n",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
|
||
|
-
|
||
|
/* get the set of RPC functions for this context */
|
||
|
|
||
|
pipe_fns = find_pipe_fns_by_context(p->contexts,
|
||
|
pkt->u.request.context_id);
|
||
|
-
|
||
|
- if ( pipe_fns ) {
|
||
|
- TALLOC_CTX *frame = talloc_stackframe();
|
||
|
- ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds);
|
||
|
+ if (pipe_fns == NULL) {
|
||
|
+ DEBUG(0, ("No rpc function table associated with context "
|
||
|
+ "[%d]\n",
|
||
|
+ pkt->u.request.context_id));
|
||
|
+ data_blob_free(&p->out_data.rdata);
|
||
|
TALLOC_FREE(frame);
|
||
|
+ return false;
|
||
|
}
|
||
|
- else {
|
||
|
- DEBUG(0, ("No rpc function table associated with context "
|
||
|
- "[%d] on pipe [%s]\n",
|
||
|
- pkt->u.request.context_id,
|
||
|
- get_pipe_name_from_syntax(talloc_tos(),
|
||
|
- &p->syntax)));
|
||
|
+
|
||
|
+ DEBUG(5, ("Requested \\PIPE\\%s\n",
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), &pipe_fns->syntax)));
|
||
|
+
|
||
|
+ if (!srv_pipe_check_verification_trailer(p, pkt, pipe_fns)) {
|
||
|
+ DEBUG(1, ("srv_pipe_check_verification_trailer: failed\n"));
|
||
|
+ setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_ACCESS_DENIED));
|
||
|
+ data_blob_free(&p->out_data.rdata);
|
||
|
+ TALLOC_FREE(frame);
|
||
|
+ return true;
|
||
|
}
|
||
|
|
||
|
- if (changed_user) {
|
||
|
- unbecome_authenticated_pipe_user();
|
||
|
+ if (!become_authenticated_pipe_user(p->session_info)) {
|
||
|
+ DEBUG(1, ("Failed to become pipe user!\n"));
|
||
|
+ data_blob_free(&p->out_data.rdata);
|
||
|
+ TALLOC_FREE(frame);
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
+ ret = api_rpcTNP(p, pkt, pipe_fns->cmds, pipe_fns->n_cmds,
|
||
|
+ &pipe_fns->syntax);
|
||
|
+ unbecome_authenticated_pipe_user();
|
||
|
+
|
||
|
+ TALLOC_FREE(frame);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
@@ -1600,20 +1644,21 @@ static bool api_pipe_request(struct pipe
|
||
|
********************************************************************/
|
||
|
|
||
|
static bool api_rpcTNP(struct pipes_struct *p, struct ncacn_packet *pkt,
|
||
|
- const struct api_struct *api_rpc_cmds, int n_cmds)
|
||
|
+ const struct api_struct *api_rpc_cmds, int n_cmds,
|
||
|
+ const struct ndr_syntax_id *syntax)
|
||
|
{
|
||
|
int fn_num;
|
||
|
uint32_t offset1;
|
||
|
|
||
|
/* interpret the command */
|
||
|
DEBUG(4,("api_rpcTNP: %s op 0x%x - ",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), syntax),
|
||
|
pkt->u.request.opnum));
|
||
|
|
||
|
if (DEBUGLEVEL >= 50) {
|
||
|
fstring name;
|
||
|
slprintf(name, sizeof(name)-1, "in_%s",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax));
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), syntax));
|
||
|
dump_pdu_region(name, pkt->u.request.opnum,
|
||
|
&p->in_data.data, 0,
|
||
|
p->in_data.data.length);
|
||
|
@@ -1646,37 +1691,30 @@ static bool api_rpcTNP(struct pipes_stru
|
||
|
/* do the actual command */
|
||
|
if(!api_rpc_cmds[fn_num].fn(p)) {
|
||
|
DEBUG(0,("api_rpcTNP: %s: %s failed.\n",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), syntax),
|
||
|
api_rpc_cmds[fn_num].name));
|
||
|
data_blob_free(&p->out_data.rdata);
|
||
|
return False;
|
||
|
}
|
||
|
|
||
|
- if (p->bad_handle_fault_state) {
|
||
|
- DEBUG(4,("api_rpcTNP: bad handle fault return.\n"));
|
||
|
- p->bad_handle_fault_state = False;
|
||
|
- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_CONTEXT_MISMATCH));
|
||
|
- return True;
|
||
|
- }
|
||
|
-
|
||
|
- if (p->rng_fault_state) {
|
||
|
- DEBUG(4, ("api_rpcTNP: rng fault return\n"));
|
||
|
- p->rng_fault_state = False;
|
||
|
- setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_OP_RNG_ERROR));
|
||
|
- return True;
|
||
|
+ if (p->fault_state) {
|
||
|
+ DEBUG(4,("api_rpcTNP: fault(%d) return.\n", p->fault_state));
|
||
|
+ setup_fault_pdu(p, NT_STATUS(p->fault_state));
|
||
|
+ p->fault_state = 0;
|
||
|
+ return true;
|
||
|
}
|
||
|
|
||
|
if (DEBUGLEVEL >= 50) {
|
||
|
fstring name;
|
||
|
slprintf(name, sizeof(name)-1, "out_%s",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax));
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), syntax));
|
||
|
dump_pdu_region(name, pkt->u.request.opnum,
|
||
|
&p->out_data.rdata, offset1,
|
||
|
p->out_data.rdata.length);
|
||
|
}
|
||
|
|
||
|
DEBUG(5,("api_rpcTNP: called %s successfully\n",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
|
||
|
+ get_pipe_name_from_syntax(talloc_tos(), syntax)));
|
||
|
|
||
|
/* Check for buffer underflow in rpc parsing */
|
||
|
if ((DEBUGLEVEL >= 10) &&
|
||
|
@@ -1718,9 +1756,9 @@ void set_incoming_fault(struct pipes_str
|
||
|
data_blob_free(&p->in_data.data);
|
||
|
p->in_data.pdu_needed_len = 0;
|
||
|
p->in_data.pdu.length = 0;
|
||
|
- p->fault_state = True;
|
||
|
- DEBUG(10, ("set_incoming_fault: Setting fault state on pipe %s\n",
|
||
|
- get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
|
||
|
+ p->fault_state = DCERPC_FAULT_CANT_PERFORM;
|
||
|
+
|
||
|
+ DEBUG(10, ("Setting fault state\n"));
|
||
|
}
|
||
|
|
||
|
static NTSTATUS dcesrv_auth_request(struct pipe_auth_data *auth,
|
||
|
--- a/source3/include/ntdomain.h
|
||
|
+++ b/source3/include/ntdomain.h
|
||
|
@@ -87,6 +87,7 @@ typedef struct pipe_rpc_fns {
|
||
|
const struct api_struct *cmds;
|
||
|
int n_cmds;
|
||
|
uint32 context_id;
|
||
|
+ struct ndr_syntax_id syntax;
|
||
|
|
||
|
} PIPE_RPC_FNS;
|
||
|
|
||
|
@@ -134,22 +135,10 @@ struct pipes_struct {
|
||
|
bool pipe_bound;
|
||
|
|
||
|
/*
|
||
|
- * Set to true when we should return fault PDU's for everything.
|
||
|
- */
|
||
|
-
|
||
|
- bool fault_state;
|
||
|
-
|
||
|
- /*
|
||
|
- * Set to true when we should return fault PDU's for a bad handle.
|
||
|
- */
|
||
|
-
|
||
|
- bool bad_handle_fault_state;
|
||
|
-
|
||
|
- /*
|
||
|
- * Set to true when the backend does not support a call.
|
||
|
+ * Set the DCERPC_FAULT to return.
|
||
|
*/
|
||
|
|
||
|
- bool rng_fault_state;
|
||
|
+ int fault_state;
|
||
|
|
||
|
/*
|
||
|
* Set to RPC_BIG_ENDIAN when dealing with big-endian PDU's
|
||
|
--- a/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
|
||
|
+++ b/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
|
||
|
@@ -183,7 +183,7 @@ sub ParseFunction($$)
|
||
|
);
|
||
|
|
||
|
pidl "";
|
||
|
- pidl "if (p->rng_fault_state) {";
|
||
|
+ pidl "if (p->fault_state) {";
|
||
|
pidl "\ttalloc_free(r);";
|
||
|
pidl "\t/* Return true here, srv_pipe_hnd.c will take care */";
|
||
|
pidl "\treturn true;";
|
||
|
--- a/source3/rpc_server/dfs/srv_dfs_nt.c
|
||
|
+++ b/source3/rpc_server/dfs/srv_dfs_nt.c
|
||
|
@@ -411,125 +411,125 @@ WERROR _dfs_GetInfo(struct pipes_struct
|
||
|
WERROR _dfs_SetInfo(struct pipes_struct *p, struct dfs_SetInfo *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_Rename(struct pipes_struct *p, struct dfs_Rename *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_Move(struct pipes_struct *p, struct dfs_Move *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_ManagerGetConfigInfo(struct pipes_struct *p, struct dfs_ManagerGetConfigInfo *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_ManagerSendSiteInfo(struct pipes_struct *p, struct dfs_ManagerSendSiteInfo *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_AddFtRoot(struct pipes_struct *p, struct dfs_AddFtRoot *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_RemoveFtRoot(struct pipes_struct *p, struct dfs_RemoveFtRoot *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_AddStdRoot(struct pipes_struct *p, struct dfs_AddStdRoot *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_RemoveStdRoot(struct pipes_struct *p, struct dfs_RemoveStdRoot *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_ManagerInitialize(struct pipes_struct *p, struct dfs_ManagerInitialize *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_AddStdRootForced(struct pipes_struct *p, struct dfs_AddStdRootForced *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_GetDcAddress(struct pipes_struct *p, struct dfs_GetDcAddress *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_SetDcAddress(struct pipes_struct *p, struct dfs_SetDcAddress *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_FlushFtTable(struct pipes_struct *p, struct dfs_FlushFtTable *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_Add2(struct pipes_struct *p, struct dfs_Add2 *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_Remove2(struct pipes_struct *p, struct dfs_Remove2 *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_EnumEx(struct pipes_struct *p, struct dfs_EnumEx *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _dfs_SetInfo2(struct pipes_struct *p, struct dfs_SetInfo2 *r)
|
||
|
{
|
||
|
/* FIXME: Implement your code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/dssetup/srv_dssetup_nt.c
|
||
|
+++ b/source3/rpc_server/dssetup/srv_dssetup_nt.c
|
||
|
@@ -130,7 +130,7 @@ WERROR _dssetup_DsRoleGetPrimaryDomainIn
|
||
|
WERROR _dssetup_DsRoleDnsNameToFlatName(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleDnsNameToFlatName *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -140,7 +140,7 @@ WERROR _dssetup_DsRoleDnsNameToFlatName(
|
||
|
WERROR _dssetup_DsRoleDcAsDc(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleDcAsDc *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -150,7 +150,7 @@ WERROR _dssetup_DsRoleDcAsDc(struct pipe
|
||
|
WERROR _dssetup_DsRoleDcAsReplica(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleDcAsReplica *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -160,7 +160,7 @@ WERROR _dssetup_DsRoleDcAsReplica(struct
|
||
|
WERROR _dssetup_DsRoleDemoteDc(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleDemoteDc *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -170,7 +170,7 @@ WERROR _dssetup_DsRoleDemoteDc(struct pi
|
||
|
WERROR _dssetup_DsRoleGetDcOperationProgress(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleGetDcOperationProgress *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -180,7 +180,7 @@ WERROR _dssetup_DsRoleGetDcOperationProg
|
||
|
WERROR _dssetup_DsRoleGetDcOperationResults(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleGetDcOperationResults *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -190,7 +190,7 @@ WERROR _dssetup_DsRoleGetDcOperationResu
|
||
|
WERROR _dssetup_DsRoleCancel(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleCancel *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -200,7 +200,7 @@ WERROR _dssetup_DsRoleCancel(struct pipe
|
||
|
WERROR _dssetup_DsRoleServerSaveStateForUpgrade(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleServerSaveStateForUpgrade *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -210,7 +210,7 @@ WERROR _dssetup_DsRoleServerSaveStateFor
|
||
|
WERROR _dssetup_DsRoleUpgradeDownlevelServer(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleUpgradeDownlevelServer *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -220,6 +220,6 @@ WERROR _dssetup_DsRoleUpgradeDownlevelSe
|
||
|
WERROR _dssetup_DsRoleAbortDownlevelServerUpgrade(struct pipes_struct *p,
|
||
|
struct dssetup_DsRoleAbortDownlevelServerUpgrade *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/echo/srv_echo_nt.c
|
||
|
+++ b/source3/rpc_server/echo/srv_echo_nt.c
|
||
|
@@ -87,13 +87,13 @@ void _echo_SourceData(struct pipes_struc
|
||
|
|
||
|
void _echo_TestCall(struct pipes_struct *p, struct echo_TestCall *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _echo_TestCall2(struct pipes_struct *p, struct echo_TestCall2 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_OK;
|
||
|
}
|
||
|
|
||
|
@@ -105,18 +105,18 @@ uint32 _echo_TestSleep(struct pipes_stru
|
||
|
|
||
|
void _echo_TestEnum(struct pipes_struct *p, struct echo_TestEnum *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void _echo_TestSurrounding(struct pipes_struct *p, struct echo_TestSurrounding *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
uint16 _echo_TestDoublePointer(struct pipes_struct *p, struct echo_TestDoublePointer *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return 0;
|
||
|
}
|
||
|
--- a/source3/rpc_server/epmapper/srv_epmapper.c
|
||
|
+++ b/source3/rpc_server/epmapper/srv_epmapper.c
|
||
|
@@ -297,6 +297,7 @@ error_status_t _epm_Insert(struct pipes_
|
||
|
/* If this is not a priviledged users, return */
|
||
|
if (p->transport != NCALRPC ||
|
||
|
!is_priviledged_pipe(p->session_info)) {
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return EPMAPPER_STATUS_CANT_PERFORM_OP;
|
||
|
}
|
||
|
|
||
|
@@ -433,6 +434,7 @@ error_status_t _epm_Delete(struct pipes_
|
||
|
/* If this is not a priviledged users, return */
|
||
|
if (p->transport != NCALRPC ||
|
||
|
!is_priviledged_pipe(p->session_info)) {
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return EPMAPPER_STATUS_CANT_PERFORM_OP;
|
||
|
}
|
||
|
|
||
|
@@ -1096,7 +1098,7 @@ error_status_t _epm_LookupHandleFree(str
|
||
|
error_status_t _epm_InqObject(struct pipes_struct *p,
|
||
|
struct epm_InqObject *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return EPMAPPER_STATUS_CANT_PERFORM_OP;
|
||
|
}
|
||
|
|
||
|
@@ -1110,7 +1112,7 @@ error_status_t _epm_InqObject(struct pip
|
||
|
error_status_t _epm_MgmtDelete(struct pipes_struct *p,
|
||
|
struct epm_MgmtDelete *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return EPMAPPER_STATUS_CANT_PERFORM_OP;
|
||
|
}
|
||
|
|
||
|
@@ -1121,7 +1123,7 @@ error_status_t _epm_MgmtDelete(struct pi
|
||
|
error_status_t _epm_MapAuth(struct pipes_struct *p,
|
||
|
struct epm_MapAuth *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return EPMAPPER_STATUS_CANT_PERFORM_OP;
|
||
|
}
|
||
|
|
||
|
--- a/source3/rpc_server/eventlog/srv_eventlog_nt.c
|
||
|
+++ b/source3/rpc_server/eventlog/srv_eventlog_nt.c
|
||
|
@@ -695,7 +695,7 @@ NTSTATUS _eventlog_GetNumRecords(struct
|
||
|
|
||
|
NTSTATUS _eventlog_BackupEventLogW(struct pipes_struct *p, struct eventlog_BackupEventLogW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -838,104 +838,104 @@ NTSTATUS _eventlog_ReportEventW(struct p
|
||
|
NTSTATUS _eventlog_DeregisterEventSource(struct pipes_struct *p,
|
||
|
struct eventlog_DeregisterEventSource *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_ChangeNotify(struct pipes_struct *p,
|
||
|
struct eventlog_ChangeNotify *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_RegisterEventSourceW(struct pipes_struct *p,
|
||
|
struct eventlog_RegisterEventSourceW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_OpenBackupEventLogW(struct pipes_struct *p,
|
||
|
struct eventlog_OpenBackupEventLogW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_ClearEventLogA(struct pipes_struct *p,
|
||
|
struct eventlog_ClearEventLogA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_BackupEventLogA(struct pipes_struct *p,
|
||
|
struct eventlog_BackupEventLogA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_OpenEventLogA(struct pipes_struct *p,
|
||
|
struct eventlog_OpenEventLogA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_RegisterEventSourceA(struct pipes_struct *p,
|
||
|
struct eventlog_RegisterEventSourceA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_OpenBackupEventLogA(struct pipes_struct *p,
|
||
|
struct eventlog_OpenBackupEventLogA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_ReadEventLogA(struct pipes_struct *p,
|
||
|
struct eventlog_ReadEventLogA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_ReportEventA(struct pipes_struct *p,
|
||
|
struct eventlog_ReportEventA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_RegisterClusterSvc(struct pipes_struct *p,
|
||
|
struct eventlog_RegisterClusterSvc *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_DeregisterClusterSvc(struct pipes_struct *p,
|
||
|
struct eventlog_DeregisterClusterSvc *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_WriteClusterEvents(struct pipes_struct *p,
|
||
|
struct eventlog_WriteClusterEvents *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _eventlog_ReportEventAndSourceW(struct pipes_struct *p,
|
||
|
struct eventlog_ReportEventAndSourceW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/lsa/srv_lsa_nt.c
|
||
|
+++ b/source3/rpc_server/lsa/srv_lsa_nt.c
|
||
|
@@ -817,7 +817,7 @@ NTSTATUS _lsa_QueryInfoPolicy2(struct pi
|
||
|
struct lsa_QueryInfoPolicy r;
|
||
|
|
||
|
if ((pdb_capabilities() & PDB_CAP_ADS) == 0) {
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -3210,88 +3210,88 @@ NTSTATUS _lsa_Delete(struct pipes_struct
|
||
|
|
||
|
NTSTATUS _lsa_SetSecObj(struct pipes_struct *p, struct lsa_SetSecObj *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_ChangePassword(struct pipes_struct *p,
|
||
|
struct lsa_ChangePassword *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetInfoPolicy(struct pipes_struct *p, struct lsa_SetInfoPolicy *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_ClearAuditLog(struct pipes_struct *p, struct lsa_ClearAuditLog *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_GetQuotasForAccount(struct pipes_struct *p,
|
||
|
struct lsa_GetQuotasForAccount *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetQuotasForAccount(struct pipes_struct *p,
|
||
|
struct lsa_SetQuotasForAccount *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetInformationTrustedDomain(struct pipes_struct *p,
|
||
|
struct lsa_SetInformationTrustedDomain *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_QuerySecret(struct pipes_struct *p, struct lsa_QuerySecret *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetTrustedDomainInfo(struct pipes_struct *p,
|
||
|
struct lsa_SetTrustedDomainInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_StorePrivateData(struct pipes_struct *p,
|
||
|
struct lsa_StorePrivateData *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_RetrievePrivateData(struct pipes_struct *p,
|
||
|
struct lsa_RetrievePrivateData *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetInfoPolicy2(struct pipes_struct *p,
|
||
|
struct lsa_SetInfoPolicy2 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetTrustedDomainInfoByName(struct pipes_struct *p,
|
||
|
struct lsa_SetTrustedDomainInfoByName *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -3310,7 +3310,7 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc
|
||
|
* _lsa_EnumTrustedDomains() afterwards - gd */
|
||
|
|
||
|
if (!(pdb_capabilities() & PDB_CAP_TRUSTED_DOMAINS_EX)) {
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -3379,107 +3379,107 @@ NTSTATUS _lsa_EnumTrustedDomainsEx(struc
|
||
|
NTSTATUS _lsa_QueryDomainInformationPolicy(struct pipes_struct *p,
|
||
|
struct lsa_QueryDomainInformationPolicy *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_SetDomainInformationPolicy(struct pipes_struct *p,
|
||
|
struct lsa_SetDomainInformationPolicy *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_TestCall(struct pipes_struct *p, struct lsa_TestCall *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRWRITE(struct pipes_struct *p, struct lsa_CREDRWRITE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRREAD(struct pipes_struct *p, struct lsa_CREDRREAD *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRENUMERATE(struct pipes_struct *p, struct lsa_CREDRENUMERATE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRWRITEDOMAINCREDENTIALS(struct pipes_struct *p,
|
||
|
struct lsa_CREDRWRITEDOMAINCREDENTIALS *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRREADDOMAINCREDENTIALS(struct pipes_struct *p,
|
||
|
struct lsa_CREDRREADDOMAINCREDENTIALS *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRDELETE(struct pipes_struct *p, struct lsa_CREDRDELETE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRGETTARGETINFO(struct pipes_struct *p,
|
||
|
struct lsa_CREDRGETTARGETINFO *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRPROFILELOADED(struct pipes_struct *p,
|
||
|
struct lsa_CREDRPROFILELOADED *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_CREDRGETSESSIONTYPES(struct pipes_struct *p,
|
||
|
struct lsa_CREDRGETSESSIONTYPES *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARREGISTERAUDITEVENT(struct pipes_struct *p,
|
||
|
struct lsa_LSARREGISTERAUDITEVENT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARGENAUDITEVENT(struct pipes_struct *p,
|
||
|
struct lsa_LSARGENAUDITEVENT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARUNREGISTERAUDITEVENT(struct pipes_struct *p,
|
||
|
struct lsa_LSARUNREGISTERAUDITEVENT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_lsaRQueryForestTrustInformation(struct pipes_struct *p,
|
||
|
struct lsa_lsaRQueryForestTrustInformation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -3992,34 +3992,34 @@ NTSTATUS _lsa_lsaRSetForestTrustInformat
|
||
|
NTSTATUS _lsa_CREDRRENAME(struct pipes_struct *p,
|
||
|
struct lsa_CREDRRENAME *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSAROPENPOLICYSCE(struct pipes_struct *p,
|
||
|
struct lsa_LSAROPENPOLICYSCE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
|
||
|
struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
|
||
|
struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(struct pipes_struct *p,
|
||
|
struct lsa_LSARADTREPORTSECURITYEVENT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/netlogon/srv_netlog_nt.c
|
||
|
+++ b/source3/rpc_server/netlogon/srv_netlog_nt.c
|
||
|
@@ -1787,7 +1787,7 @@ NTSTATUS _netr_LogonSamLogonEx(struct pi
|
||
|
WERROR _netr_LogonUasLogon(struct pipes_struct *p,
|
||
|
struct netr_LogonUasLogon *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1797,7 +1797,7 @@ WERROR _netr_LogonUasLogon(struct pipes_
|
||
|
WERROR _netr_LogonUasLogoff(struct pipes_struct *p,
|
||
|
struct netr_LogonUasLogoff *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1807,7 +1807,7 @@ WERROR _netr_LogonUasLogoff(struct pipes
|
||
|
NTSTATUS _netr_DatabaseDeltas(struct pipes_struct *p,
|
||
|
struct netr_DatabaseDeltas *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1817,7 +1817,7 @@ NTSTATUS _netr_DatabaseDeltas(struct pip
|
||
|
NTSTATUS _netr_DatabaseSync(struct pipes_struct *p,
|
||
|
struct netr_DatabaseSync *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1827,7 +1827,7 @@ NTSTATUS _netr_DatabaseSync(struct pipes
|
||
|
NTSTATUS _netr_AccountDeltas(struct pipes_struct *p,
|
||
|
struct netr_AccountDeltas *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1837,7 +1837,7 @@ NTSTATUS _netr_AccountDeltas(struct pipe
|
||
|
NTSTATUS _netr_AccountSync(struct pipes_struct *p,
|
||
|
struct netr_AccountSync *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1978,7 +1978,7 @@ WERROR _netr_GetAnyDCName(struct pipes_s
|
||
|
NTSTATUS _netr_DatabaseSync2(struct pipes_struct *p,
|
||
|
struct netr_DatabaseSync2 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1988,7 +1988,7 @@ NTSTATUS _netr_DatabaseSync2(struct pipe
|
||
|
NTSTATUS _netr_DatabaseRedo(struct pipes_struct *p,
|
||
|
struct netr_DatabaseRedo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -1998,7 +1998,7 @@ NTSTATUS _netr_DatabaseRedo(struct pipes
|
||
|
WERROR _netr_DsRGetDCName(struct pipes_struct *p,
|
||
|
struct netr_DsRGetDCName *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2017,7 +2017,7 @@ NTSTATUS _netr_LogonGetCapabilities(stru
|
||
|
WERROR _netr_NETRLOGONSETSERVICEBITS(struct pipes_struct *p,
|
||
|
struct netr_NETRLOGONSETSERVICEBITS *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2027,7 +2027,7 @@ WERROR _netr_NETRLOGONSETSERVICEBITS(str
|
||
|
WERROR _netr_LogonGetTrustRid(struct pipes_struct *p,
|
||
|
struct netr_LogonGetTrustRid *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2037,7 +2037,7 @@ WERROR _netr_LogonGetTrustRid(struct pip
|
||
|
WERROR _netr_NETRLOGONCOMPUTESERVERDIGEST(struct pipes_struct *p,
|
||
|
struct netr_NETRLOGONCOMPUTESERVERDIGEST *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2047,7 +2047,7 @@ WERROR _netr_NETRLOGONCOMPUTESERVERDIGES
|
||
|
WERROR _netr_NETRLOGONCOMPUTECLIENTDIGEST(struct pipes_struct *p,
|
||
|
struct netr_NETRLOGONCOMPUTECLIENTDIGEST *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2057,7 +2057,7 @@ WERROR _netr_NETRLOGONCOMPUTECLIENTDIGES
|
||
|
WERROR _netr_DsRGetDCNameEx(struct pipes_struct *p,
|
||
|
struct netr_DsRGetDCNameEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2067,7 +2067,7 @@ WERROR _netr_DsRGetDCNameEx(struct pipes
|
||
|
WERROR _netr_DsRGetSiteName(struct pipes_struct *p,
|
||
|
struct netr_DsRGetSiteName *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2077,7 +2077,7 @@ WERROR _netr_DsRGetSiteName(struct pipes
|
||
|
NTSTATUS _netr_LogonGetDomainInfo(struct pipes_struct *p,
|
||
|
struct netr_LogonGetDomainInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -2087,7 +2087,7 @@ NTSTATUS _netr_LogonGetDomainInfo(struct
|
||
|
WERROR _netr_ServerPasswordGet(struct pipes_struct *p,
|
||
|
struct netr_ServerPasswordGet *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2097,7 +2097,7 @@ WERROR _netr_ServerPasswordGet(struct pi
|
||
|
WERROR _netr_NETRLOGONSENDTOSAM(struct pipes_struct *p,
|
||
|
struct netr_NETRLOGONSENDTOSAM *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2107,7 +2107,7 @@ WERROR _netr_NETRLOGONSENDTOSAM(struct p
|
||
|
WERROR _netr_DsRAddressToSitenamesW(struct pipes_struct *p,
|
||
|
struct netr_DsRAddressToSitenamesW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2117,7 +2117,7 @@ WERROR _netr_DsRAddressToSitenamesW(stru
|
||
|
WERROR _netr_DsRGetDCNameEx2(struct pipes_struct *p,
|
||
|
struct netr_DsRGetDCNameEx2 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2127,7 +2127,7 @@ WERROR _netr_DsRGetDCNameEx2(struct pipe
|
||
|
WERROR _netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN(struct pipes_struct *p,
|
||
|
struct netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2137,7 +2137,7 @@ WERROR _netr_NETRLOGONGETTIMESERVICEPARE
|
||
|
WERROR _netr_NetrEnumerateTrustedDomainsEx(struct pipes_struct *p,
|
||
|
struct netr_NetrEnumerateTrustedDomainsEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2147,7 +2147,7 @@ WERROR _netr_NetrEnumerateTrustedDomains
|
||
|
WERROR _netr_DsRAddressToSitenamesExW(struct pipes_struct *p,
|
||
|
struct netr_DsRAddressToSitenamesExW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2157,7 +2157,7 @@ WERROR _netr_DsRAddressToSitenamesExW(st
|
||
|
WERROR _netr_DsrGetDcSiteCoverageW(struct pipes_struct *p,
|
||
|
struct netr_DsrGetDcSiteCoverageW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2167,7 +2167,7 @@ WERROR _netr_DsrGetDcSiteCoverageW(struc
|
||
|
WERROR _netr_DsrEnumerateDomainTrusts(struct pipes_struct *p,
|
||
|
struct netr_DsrEnumerateDomainTrusts *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2177,7 +2177,7 @@ WERROR _netr_DsrEnumerateDomainTrusts(st
|
||
|
WERROR _netr_DsrDeregisterDNSHostRecords(struct pipes_struct *p,
|
||
|
struct netr_DsrDeregisterDNSHostRecords *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2187,7 +2187,7 @@ WERROR _netr_DsrDeregisterDNSHostRecords
|
||
|
NTSTATUS _netr_ServerTrustPasswordsGet(struct pipes_struct *p,
|
||
|
struct netr_ServerTrustPasswordsGet *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -2197,7 +2197,7 @@ NTSTATUS _netr_ServerTrustPasswordsGet(s
|
||
|
WERROR _netr_DsRGetForestTrustInformation(struct pipes_struct *p,
|
||
|
struct netr_DsRGetForestTrustInformation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -2476,7 +2476,7 @@ NTSTATUS _netr_ServerGetTrustInfo(struct
|
||
|
NTSTATUS _netr_Unused47(struct pipes_struct *p,
|
||
|
struct netr_Unused47 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -2486,6 +2486,6 @@ NTSTATUS _netr_Unused47(struct pipes_str
|
||
|
NTSTATUS _netr_DsrUpdateReadOnlyServerDnsRecords(struct pipes_struct *p,
|
||
|
struct netr_DsrUpdateReadOnlyServerDnsRecords *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c
|
||
|
+++ b/source3/rpc_server/ntsvcs/srv_ntsvcs_nt.c
|
||
|
@@ -227,7 +227,7 @@ WERROR _PNP_HwProfFlags(struct pipes_str
|
||
|
WERROR _PNP_Disconnect(struct pipes_struct *p,
|
||
|
struct PNP_Disconnect *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -237,7 +237,7 @@ WERROR _PNP_Disconnect(struct pipes_stru
|
||
|
WERROR _PNP_Connect(struct pipes_struct *p,
|
||
|
struct PNP_Connect *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -247,7 +247,7 @@ WERROR _PNP_Connect(struct pipes_struct
|
||
|
WERROR _PNP_GetGlobalState(struct pipes_struct *p,
|
||
|
struct PNP_GetGlobalState *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -257,7 +257,7 @@ WERROR _PNP_GetGlobalState(struct pipes_
|
||
|
WERROR _PNP_InitDetection(struct pipes_struct *p,
|
||
|
struct PNP_InitDetection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -267,7 +267,7 @@ WERROR _PNP_InitDetection(struct pipes_s
|
||
|
WERROR _PNP_ReportLogOn(struct pipes_struct *p,
|
||
|
struct PNP_ReportLogOn *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -277,7 +277,7 @@ WERROR _PNP_ReportLogOn(struct pipes_str
|
||
|
WERROR _PNP_GetRootDeviceInstance(struct pipes_struct *p,
|
||
|
struct PNP_GetRootDeviceInstance *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -287,7 +287,7 @@ WERROR _PNP_GetRootDeviceInstance(struct
|
||
|
WERROR _PNP_GetRelatedDeviceInstance(struct pipes_struct *p,
|
||
|
struct PNP_GetRelatedDeviceInstance *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -297,7 +297,7 @@ WERROR _PNP_GetRelatedDeviceInstance(str
|
||
|
WERROR _PNP_EnumerateSubKeys(struct pipes_struct *p,
|
||
|
struct PNP_EnumerateSubKeys *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -307,7 +307,7 @@ WERROR _PNP_EnumerateSubKeys(struct pipe
|
||
|
WERROR _PNP_GetDepth(struct pipes_struct *p,
|
||
|
struct PNP_GetDepth *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -317,7 +317,7 @@ WERROR _PNP_GetDepth(struct pipes_struct
|
||
|
WERROR _PNP_SetDeviceRegProp(struct pipes_struct *p,
|
||
|
struct PNP_SetDeviceRegProp *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -327,7 +327,7 @@ WERROR _PNP_SetDeviceRegProp(struct pipe
|
||
|
WERROR _PNP_GetClassInstance(struct pipes_struct *p,
|
||
|
struct PNP_GetClassInstance *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -337,7 +337,7 @@ WERROR _PNP_GetClassInstance(struct pipe
|
||
|
WERROR _PNP_CreateKey(struct pipes_struct *p,
|
||
|
struct PNP_CreateKey *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -347,7 +347,7 @@ WERROR _PNP_CreateKey(struct pipes_struc
|
||
|
WERROR _PNP_DeleteRegistryKey(struct pipes_struct *p,
|
||
|
struct PNP_DeleteRegistryKey *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -357,7 +357,7 @@ WERROR _PNP_DeleteRegistryKey(struct pip
|
||
|
WERROR _PNP_GetClassCount(struct pipes_struct *p,
|
||
|
struct PNP_GetClassCount *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -367,7 +367,7 @@ WERROR _PNP_GetClassCount(struct pipes_s
|
||
|
WERROR _PNP_GetClassName(struct pipes_struct *p,
|
||
|
struct PNP_GetClassName *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -377,7 +377,7 @@ WERROR _PNP_GetClassName(struct pipes_st
|
||
|
WERROR _PNP_DeleteClassKey(struct pipes_struct *p,
|
||
|
struct PNP_DeleteClassKey *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -387,7 +387,7 @@ WERROR _PNP_DeleteClassKey(struct pipes_
|
||
|
WERROR _PNP_GetInterfaceDeviceAlias(struct pipes_struct *p,
|
||
|
struct PNP_GetInterfaceDeviceAlias *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -397,7 +397,7 @@ WERROR _PNP_GetInterfaceDeviceAlias(stru
|
||
|
WERROR _PNP_GetInterfaceDeviceList(struct pipes_struct *p,
|
||
|
struct PNP_GetInterfaceDeviceList *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -407,7 +407,7 @@ WERROR _PNP_GetInterfaceDeviceList(struc
|
||
|
WERROR _PNP_GetInterfaceDeviceListSize(struct pipes_struct *p,
|
||
|
struct PNP_GetInterfaceDeviceListSize *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -417,7 +417,7 @@ WERROR _PNP_GetInterfaceDeviceListSize(s
|
||
|
WERROR _PNP_RegisterDeviceClassAssociation(struct pipes_struct *p,
|
||
|
struct PNP_RegisterDeviceClassAssociation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -427,7 +427,7 @@ WERROR _PNP_RegisterDeviceClassAssociati
|
||
|
WERROR _PNP_UnregisterDeviceClassAssociation(struct pipes_struct *p,
|
||
|
struct PNP_UnregisterDeviceClassAssociation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -437,7 +437,7 @@ WERROR _PNP_UnregisterDeviceClassAssocia
|
||
|
WERROR _PNP_GetClassRegProp(struct pipes_struct *p,
|
||
|
struct PNP_GetClassRegProp *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -447,7 +447,7 @@ WERROR _PNP_GetClassRegProp(struct pipes
|
||
|
WERROR _PNP_SetClassRegProp(struct pipes_struct *p,
|
||
|
struct PNP_SetClassRegProp *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -457,7 +457,7 @@ WERROR _PNP_SetClassRegProp(struct pipes
|
||
|
WERROR _PNP_CreateDevInst(struct pipes_struct *p,
|
||
|
struct PNP_CreateDevInst *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -467,7 +467,7 @@ WERROR _PNP_CreateDevInst(struct pipes_s
|
||
|
WERROR _PNP_DeviceInstanceAction(struct pipes_struct *p,
|
||
|
struct PNP_DeviceInstanceAction *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -477,7 +477,7 @@ WERROR _PNP_DeviceInstanceAction(struct
|
||
|
WERROR _PNP_GetDeviceStatus(struct pipes_struct *p,
|
||
|
struct PNP_GetDeviceStatus *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -487,7 +487,7 @@ WERROR _PNP_GetDeviceStatus(struct pipes
|
||
|
WERROR _PNP_SetDeviceProblem(struct pipes_struct *p,
|
||
|
struct PNP_SetDeviceProblem *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -497,7 +497,7 @@ WERROR _PNP_SetDeviceProblem(struct pipe
|
||
|
WERROR _PNP_DisableDevInst(struct pipes_struct *p,
|
||
|
struct PNP_DisableDevInst *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -507,7 +507,7 @@ WERROR _PNP_DisableDevInst(struct pipes_
|
||
|
WERROR _PNP_UninstallDevInst(struct pipes_struct *p,
|
||
|
struct PNP_UninstallDevInst *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -517,7 +517,7 @@ WERROR _PNP_UninstallDevInst(struct pipe
|
||
|
WERROR _PNP_AddID(struct pipes_struct *p,
|
||
|
struct PNP_AddID *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -527,7 +527,7 @@ WERROR _PNP_AddID(struct pipes_struct *p
|
||
|
WERROR _PNP_RegisterDriver(struct pipes_struct *p,
|
||
|
struct PNP_RegisterDriver *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -537,7 +537,7 @@ WERROR _PNP_RegisterDriver(struct pipes_
|
||
|
WERROR _PNP_QueryRemove(struct pipes_struct *p,
|
||
|
struct PNP_QueryRemove *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -547,7 +547,7 @@ WERROR _PNP_QueryRemove(struct pipes_str
|
||
|
WERROR _PNP_RequestDeviceEject(struct pipes_struct *p,
|
||
|
struct PNP_RequestDeviceEject *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -557,7 +557,7 @@ WERROR _PNP_RequestDeviceEject(struct pi
|
||
|
WERROR _PNP_IsDockStationPresent(struct pipes_struct *p,
|
||
|
struct PNP_IsDockStationPresent *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -567,7 +567,7 @@ WERROR _PNP_IsDockStationPresent(struct
|
||
|
WERROR _PNP_RequestEjectPC(struct pipes_struct *p,
|
||
|
struct PNP_RequestEjectPC *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -577,7 +577,7 @@ WERROR _PNP_RequestEjectPC(struct pipes_
|
||
|
WERROR _PNP_AddEmptyLogConf(struct pipes_struct *p,
|
||
|
struct PNP_AddEmptyLogConf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -587,7 +587,7 @@ WERROR _PNP_AddEmptyLogConf(struct pipes
|
||
|
WERROR _PNP_FreeLogConf(struct pipes_struct *p,
|
||
|
struct PNP_FreeLogConf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -597,7 +597,7 @@ WERROR _PNP_FreeLogConf(struct pipes_str
|
||
|
WERROR _PNP_GetFirstLogConf(struct pipes_struct *p,
|
||
|
struct PNP_GetFirstLogConf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -607,7 +607,7 @@ WERROR _PNP_GetFirstLogConf(struct pipes
|
||
|
WERROR _PNP_GetNextLogConf(struct pipes_struct *p,
|
||
|
struct PNP_GetNextLogConf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -617,7 +617,7 @@ WERROR _PNP_GetNextLogConf(struct pipes_
|
||
|
WERROR _PNP_GetLogConfPriority(struct pipes_struct *p,
|
||
|
struct PNP_GetLogConfPriority *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -627,7 +627,7 @@ WERROR _PNP_GetLogConfPriority(struct pi
|
||
|
WERROR _PNP_AddResDes(struct pipes_struct *p,
|
||
|
struct PNP_AddResDes *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -637,7 +637,7 @@ WERROR _PNP_AddResDes(struct pipes_struc
|
||
|
WERROR _PNP_FreeResDes(struct pipes_struct *p,
|
||
|
struct PNP_FreeResDes *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -647,7 +647,7 @@ WERROR _PNP_FreeResDes(struct pipes_stru
|
||
|
WERROR _PNP_GetNextResDes(struct pipes_struct *p,
|
||
|
struct PNP_GetNextResDes *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -657,7 +657,7 @@ WERROR _PNP_GetNextResDes(struct pipes_s
|
||
|
WERROR _PNP_GetResDesData(struct pipes_struct *p,
|
||
|
struct PNP_GetResDesData *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -667,7 +667,7 @@ WERROR _PNP_GetResDesData(struct pipes_s
|
||
|
WERROR _PNP_GetResDesDataSize(struct pipes_struct *p,
|
||
|
struct PNP_GetResDesDataSize *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -677,7 +677,7 @@ WERROR _PNP_GetResDesDataSize(struct pip
|
||
|
WERROR _PNP_ModifyResDes(struct pipes_struct *p,
|
||
|
struct PNP_ModifyResDes *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -687,7 +687,7 @@ WERROR _PNP_ModifyResDes(struct pipes_st
|
||
|
WERROR _PNP_DetectResourceLimit(struct pipes_struct *p,
|
||
|
struct PNP_DetectResourceLimit *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -697,7 +697,7 @@ WERROR _PNP_DetectResourceLimit(struct p
|
||
|
WERROR _PNP_QueryResConfList(struct pipes_struct *p,
|
||
|
struct PNP_QueryResConfList *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -707,7 +707,7 @@ WERROR _PNP_QueryResConfList(struct pipe
|
||
|
WERROR _PNP_SetHwProf(struct pipes_struct *p,
|
||
|
struct PNP_SetHwProf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -717,7 +717,7 @@ WERROR _PNP_SetHwProf(struct pipes_struc
|
||
|
WERROR _PNP_QueryArbitratorFreeData(struct pipes_struct *p,
|
||
|
struct PNP_QueryArbitratorFreeData *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -727,7 +727,7 @@ WERROR _PNP_QueryArbitratorFreeData(stru
|
||
|
WERROR _PNP_QueryArbitratorFreeSize(struct pipes_struct *p,
|
||
|
struct PNP_QueryArbitratorFreeSize *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -737,7 +737,7 @@ WERROR _PNP_QueryArbitratorFreeSize(stru
|
||
|
WERROR _PNP_RunDetection(struct pipes_struct *p,
|
||
|
struct PNP_RunDetection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -747,7 +747,7 @@ WERROR _PNP_RunDetection(struct pipes_st
|
||
|
WERROR _PNP_RegisterNotification(struct pipes_struct *p,
|
||
|
struct PNP_RegisterNotification *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -757,7 +757,7 @@ WERROR _PNP_RegisterNotification(struct
|
||
|
WERROR _PNP_UnregisterNotification(struct pipes_struct *p,
|
||
|
struct PNP_UnregisterNotification *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -767,7 +767,7 @@ WERROR _PNP_UnregisterNotification(struc
|
||
|
WERROR _PNP_GetCustomDevProp(struct pipes_struct *p,
|
||
|
struct PNP_GetCustomDevProp *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -777,7 +777,7 @@ WERROR _PNP_GetCustomDevProp(struct pipe
|
||
|
WERROR _PNP_GetVersionInternal(struct pipes_struct *p,
|
||
|
struct PNP_GetVersionInternal *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -787,7 +787,7 @@ WERROR _PNP_GetVersionInternal(struct pi
|
||
|
WERROR _PNP_GetBlockedDriverInfo(struct pipes_struct *p,
|
||
|
struct PNP_GetBlockedDriverInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -797,6 +797,6 @@ WERROR _PNP_GetBlockedDriverInfo(struct
|
||
|
WERROR _PNP_GetServerSideDeviceInstallFlags(struct pipes_struct *p,
|
||
|
struct PNP_GetServerSideDeviceInstallFlags *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/rpc_handles.c
|
||
|
+++ b/source3/rpc_server/rpc_handles.c
|
||
|
@@ -242,7 +242,7 @@ static struct dcesrv_handle *find_policy
|
||
|
DEBUG(4,("Policy not found: "));
|
||
|
dump_data(4, (uint8_t *)hnd, sizeof(*hnd));
|
||
|
|
||
|
- p->bad_handle_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_CONTEXT_MISMATCH;
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
--- a/source3/rpc_server/rpc_ncacn_np.c
|
||
|
+++ b/source3/rpc_server/rpc_ncacn_np.c
|
||
|
@@ -216,24 +216,13 @@ static NTSTATUS rpcint_dispatch(struct p
|
||
|
}
|
||
|
|
||
|
if (p->fault_state) {
|
||
|
- p->fault_state = false;
|
||
|
- data_blob_free(&p->out_data.rdata);
|
||
|
- talloc_free_children(p->mem_ctx);
|
||
|
- return NT_STATUS_RPC_CALL_FAILED;
|
||
|
- }
|
||
|
-
|
||
|
- if (p->bad_handle_fault_state) {
|
||
|
- p->bad_handle_fault_state = false;
|
||
|
- data_blob_free(&p->out_data.rdata);
|
||
|
- talloc_free_children(p->mem_ctx);
|
||
|
- return NT_STATUS_RPC_SS_CONTEXT_MISMATCH;
|
||
|
- }
|
||
|
+ NTSTATUS status;
|
||
|
|
||
|
- if (p->rng_fault_state) {
|
||
|
- p->rng_fault_state = false;
|
||
|
+ status = NT_STATUS(p->fault_state);
|
||
|
+ p->fault_state = 0;
|
||
|
data_blob_free(&p->out_data.rdata);
|
||
|
talloc_free_children(p->mem_ctx);
|
||
|
- return NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE;
|
||
|
+ return status;
|
||
|
}
|
||
|
|
||
|
*out_data = p->out_data.rdata;
|
||
|
--- a/source3/rpc_server/samr/srv_samr_nt.c
|
||
|
+++ b/source3/rpc_server/samr/srv_samr_nt.c
|
||
|
@@ -6682,7 +6682,7 @@ NTSTATUS _samr_ValidatePassword(struct p
|
||
|
NTSTATUS _samr_Shutdown(struct pipes_struct *p,
|
||
|
struct samr_Shutdown *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6692,7 +6692,7 @@ NTSTATUS _samr_Shutdown(struct pipes_str
|
||
|
NTSTATUS _samr_SetMemberAttributesOfGroup(struct pipes_struct *p,
|
||
|
struct samr_SetMemberAttributesOfGroup *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6702,6 +6702,7 @@ NTSTATUS _samr_SetMemberAttributesOfGrou
|
||
|
NTSTATUS _samr_TestPrivateFunctionsDomain(struct pipes_struct *p,
|
||
|
struct samr_TestPrivateFunctionsDomain *r)
|
||
|
{
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6711,6 +6712,7 @@ NTSTATUS _samr_TestPrivateFunctionsDomai
|
||
|
NTSTATUS _samr_TestPrivateFunctionsUser(struct pipes_struct *p,
|
||
|
struct samr_TestPrivateFunctionsUser *r)
|
||
|
{
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6720,7 +6722,7 @@ NTSTATUS _samr_TestPrivateFunctionsUser(
|
||
|
NTSTATUS _samr_AddMultipleMembersToAlias(struct pipes_struct *p,
|
||
|
struct samr_AddMultipleMembersToAlias *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6730,7 +6732,7 @@ NTSTATUS _samr_AddMultipleMembersToAlias
|
||
|
NTSTATUS _samr_RemoveMultipleMembersFromAlias(struct pipes_struct *p,
|
||
|
struct samr_RemoveMultipleMembersFromAlias *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6740,7 +6742,7 @@ NTSTATUS _samr_RemoveMultipleMembersFrom
|
||
|
NTSTATUS _samr_SetBootKeyInformation(struct pipes_struct *p,
|
||
|
struct samr_SetBootKeyInformation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6750,7 +6752,7 @@ NTSTATUS _samr_SetBootKeyInformation(str
|
||
|
NTSTATUS _samr_GetBootKeyInformation(struct pipes_struct *p,
|
||
|
struct samr_GetBootKeyInformation *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
@@ -6760,6 +6762,6 @@ NTSTATUS _samr_GetBootKeyInformation(str
|
||
|
NTSTATUS _samr_SetDsrmPassword(struct pipes_struct *p,
|
||
|
struct samr_SetDsrmPassword *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return NT_STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
|
||
|
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
|
||
|
@@ -10156,7 +10156,7 @@ WERROR _spoolss_AddPort(struct pipes_str
|
||
|
WERROR _spoolss_GetPrinterDriver(struct pipes_struct *p,
|
||
|
struct spoolss_GetPrinterDriver *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10167,7 +10167,7 @@ WERROR _spoolss_GetPrinterDriver(struct
|
||
|
WERROR _spoolss_ReadPrinter(struct pipes_struct *p,
|
||
|
struct spoolss_ReadPrinter *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10178,7 +10178,7 @@ WERROR _spoolss_ReadPrinter(struct pipes
|
||
|
WERROR _spoolss_WaitForPrinterChange(struct pipes_struct *p,
|
||
|
struct spoolss_WaitForPrinterChange *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10189,7 +10189,7 @@ WERROR _spoolss_WaitForPrinterChange(str
|
||
|
WERROR _spoolss_ConfigurePort(struct pipes_struct *p,
|
||
|
struct spoolss_ConfigurePort *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10200,7 +10200,7 @@ WERROR _spoolss_ConfigurePort(struct pip
|
||
|
WERROR _spoolss_DeletePort(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePort *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10211,7 +10211,7 @@ WERROR _spoolss_DeletePort(struct pipes_
|
||
|
WERROR _spoolss_CreatePrinterIC(struct pipes_struct *p,
|
||
|
struct spoolss_CreatePrinterIC *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10222,7 +10222,7 @@ WERROR _spoolss_CreatePrinterIC(struct p
|
||
|
WERROR _spoolss_PlayGDIScriptOnPrinterIC(struct pipes_struct *p,
|
||
|
struct spoolss_PlayGDIScriptOnPrinterIC *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10233,7 +10233,7 @@ WERROR _spoolss_PlayGDIScriptOnPrinterIC
|
||
|
WERROR _spoolss_DeletePrinterIC(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePrinterIC *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10244,7 +10244,7 @@ WERROR _spoolss_DeletePrinterIC(struct p
|
||
|
WERROR _spoolss_AddPrinterConnection(struct pipes_struct *p,
|
||
|
struct spoolss_AddPrinterConnection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10255,7 +10255,7 @@ WERROR _spoolss_AddPrinterConnection(str
|
||
|
WERROR _spoolss_DeletePrinterConnection(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePrinterConnection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10266,7 +10266,7 @@ WERROR _spoolss_DeletePrinterConnection(
|
||
|
WERROR _spoolss_PrinterMessageBox(struct pipes_struct *p,
|
||
|
struct spoolss_PrinterMessageBox *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10277,7 +10277,7 @@ WERROR _spoolss_PrinterMessageBox(struct
|
||
|
WERROR _spoolss_AddMonitor(struct pipes_struct *p,
|
||
|
struct spoolss_AddMonitor *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10288,7 +10288,7 @@ WERROR _spoolss_AddMonitor(struct pipes_
|
||
|
WERROR _spoolss_DeleteMonitor(struct pipes_struct *p,
|
||
|
struct spoolss_DeleteMonitor *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10299,7 +10299,7 @@ WERROR _spoolss_DeleteMonitor(struct pip
|
||
|
WERROR _spoolss_DeletePrintProcessor(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePrintProcessor *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10310,7 +10310,7 @@ WERROR _spoolss_DeletePrintProcessor(str
|
||
|
WERROR _spoolss_AddPrintProvidor(struct pipes_struct *p,
|
||
|
struct spoolss_AddPrintProvidor *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10321,7 +10321,7 @@ WERROR _spoolss_AddPrintProvidor(struct
|
||
|
WERROR _spoolss_DeletePrintProvidor(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePrintProvidor *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10332,7 +10332,7 @@ WERROR _spoolss_DeletePrintProvidor(stru
|
||
|
WERROR _spoolss_FindFirstPrinterChangeNotification(struct pipes_struct *p,
|
||
|
struct spoolss_FindFirstPrinterChangeNotification *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10343,7 +10343,7 @@ WERROR _spoolss_FindFirstPrinterChangeNo
|
||
|
WERROR _spoolss_FindNextPrinterChangeNotification(struct pipes_struct *p,
|
||
|
struct spoolss_FindNextPrinterChangeNotification *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10354,7 +10354,7 @@ WERROR _spoolss_FindNextPrinterChangeNot
|
||
|
WERROR _spoolss_RouterFindFirstPrinterChangeNotificationOld(struct pipes_struct *p,
|
||
|
struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10365,7 +10365,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh
|
||
|
WERROR _spoolss_ReplyOpenPrinter(struct pipes_struct *p,
|
||
|
struct spoolss_ReplyOpenPrinter *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10376,7 +10376,7 @@ WERROR _spoolss_ReplyOpenPrinter(struct
|
||
|
WERROR _spoolss_RouterReplyPrinter(struct pipes_struct *p,
|
||
|
struct spoolss_RouterReplyPrinter *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10387,7 +10387,7 @@ WERROR _spoolss_RouterReplyPrinter(struc
|
||
|
WERROR _spoolss_ReplyClosePrinter(struct pipes_struct *p,
|
||
|
struct spoolss_ReplyClosePrinter *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10398,7 +10398,7 @@ WERROR _spoolss_ReplyClosePrinter(struct
|
||
|
WERROR _spoolss_AddPortEx(struct pipes_struct *p,
|
||
|
struct spoolss_AddPortEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10409,7 +10409,7 @@ WERROR _spoolss_AddPortEx(struct pipes_s
|
||
|
WERROR _spoolss_RouterFindFirstPrinterChangeNotification(struct pipes_struct *p,
|
||
|
struct spoolss_RouterFindFirstPrinterChangeNotification *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10420,7 +10420,7 @@ WERROR _spoolss_RouterFindFirstPrinterCh
|
||
|
WERROR _spoolss_SpoolerInit(struct pipes_struct *p,
|
||
|
struct spoolss_SpoolerInit *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10431,7 +10431,7 @@ WERROR _spoolss_SpoolerInit(struct pipes
|
||
|
WERROR _spoolss_ResetPrinterEx(struct pipes_struct *p,
|
||
|
struct spoolss_ResetPrinterEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10442,7 +10442,7 @@ WERROR _spoolss_ResetPrinterEx(struct pi
|
||
|
WERROR _spoolss_RouterReplyPrinterEx(struct pipes_struct *p,
|
||
|
struct spoolss_RouterReplyPrinterEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10453,7 +10453,7 @@ WERROR _spoolss_RouterReplyPrinterEx(str
|
||
|
WERROR _spoolss_44(struct pipes_struct *p,
|
||
|
struct spoolss_44 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10464,7 +10464,7 @@ WERROR _spoolss_44(struct pipes_struct *
|
||
|
WERROR _spoolss_SetPort(struct pipes_struct *p,
|
||
|
struct spoolss_SetPort *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10475,7 +10475,7 @@ WERROR _spoolss_SetPort(struct pipes_str
|
||
|
WERROR _spoolss_4a(struct pipes_struct *p,
|
||
|
struct spoolss_4a *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10486,7 +10486,7 @@ WERROR _spoolss_4a(struct pipes_struct *
|
||
|
WERROR _spoolss_4b(struct pipes_struct *p,
|
||
|
struct spoolss_4b *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10497,7 +10497,7 @@ WERROR _spoolss_4b(struct pipes_struct *
|
||
|
WERROR _spoolss_4c(struct pipes_struct *p,
|
||
|
struct spoolss_4c *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10508,7 +10508,7 @@ WERROR _spoolss_4c(struct pipes_struct *
|
||
|
WERROR _spoolss_53(struct pipes_struct *p,
|
||
|
struct spoolss_53 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10519,7 +10519,7 @@ WERROR _spoolss_53(struct pipes_struct *
|
||
|
WERROR _spoolss_AddPerMachineConnection(struct pipes_struct *p,
|
||
|
struct spoolss_AddPerMachineConnection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10530,7 +10530,7 @@ WERROR _spoolss_AddPerMachineConnection(
|
||
|
WERROR _spoolss_DeletePerMachineConnection(struct pipes_struct *p,
|
||
|
struct spoolss_DeletePerMachineConnection *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10541,7 +10541,7 @@ WERROR _spoolss_DeletePerMachineConnecti
|
||
|
WERROR _spoolss_EnumPerMachineConnections(struct pipes_struct *p,
|
||
|
struct spoolss_EnumPerMachineConnections *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10552,7 +10552,7 @@ WERROR _spoolss_EnumPerMachineConnection
|
||
|
WERROR _spoolss_5a(struct pipes_struct *p,
|
||
|
struct spoolss_5a *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10563,7 +10563,7 @@ WERROR _spoolss_5a(struct pipes_struct *
|
||
|
WERROR _spoolss_5b(struct pipes_struct *p,
|
||
|
struct spoolss_5b *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10574,7 +10574,7 @@ WERROR _spoolss_5b(struct pipes_struct *
|
||
|
WERROR _spoolss_5c(struct pipes_struct *p,
|
||
|
struct spoolss_5c *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10585,7 +10585,7 @@ WERROR _spoolss_5c(struct pipes_struct *
|
||
|
WERROR _spoolss_5d(struct pipes_struct *p,
|
||
|
struct spoolss_5d *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10596,7 +10596,7 @@ WERROR _spoolss_5d(struct pipes_struct *
|
||
|
WERROR _spoolss_5e(struct pipes_struct *p,
|
||
|
struct spoolss_5e *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10607,7 +10607,7 @@ WERROR _spoolss_5e(struct pipes_struct *
|
||
|
WERROR _spoolss_5f(struct pipes_struct *p,
|
||
|
struct spoolss_5f *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10618,7 +10618,7 @@ WERROR _spoolss_5f(struct pipes_struct *
|
||
|
WERROR _spoolss_60(struct pipes_struct *p,
|
||
|
struct spoolss_60 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10629,7 +10629,7 @@ WERROR _spoolss_60(struct pipes_struct *
|
||
|
WERROR _spoolss_61(struct pipes_struct *p,
|
||
|
struct spoolss_61 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10640,7 +10640,7 @@ WERROR _spoolss_61(struct pipes_struct *
|
||
|
WERROR _spoolss_62(struct pipes_struct *p,
|
||
|
struct spoolss_62 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10651,7 +10651,7 @@ WERROR _spoolss_62(struct pipes_struct *
|
||
|
WERROR _spoolss_63(struct pipes_struct *p,
|
||
|
struct spoolss_63 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10662,7 +10662,7 @@ WERROR _spoolss_63(struct pipes_struct *
|
||
|
WERROR _spoolss_64(struct pipes_struct *p,
|
||
|
struct spoolss_64 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10673,7 +10673,7 @@ WERROR _spoolss_64(struct pipes_struct *
|
||
|
WERROR _spoolss_65(struct pipes_struct *p,
|
||
|
struct spoolss_65 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10684,7 +10684,7 @@ WERROR _spoolss_65(struct pipes_struct *
|
||
|
WERROR _spoolss_GetCorePrinterDrivers(struct pipes_struct *p,
|
||
|
struct spoolss_GetCorePrinterDrivers *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10695,7 +10695,7 @@ WERROR _spoolss_GetCorePrinterDrivers(st
|
||
|
WERROR _spoolss_67(struct pipes_struct *p,
|
||
|
struct spoolss_67 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10706,7 +10706,7 @@ WERROR _spoolss_67(struct pipes_struct *
|
||
|
WERROR _spoolss_GetPrinterDriverPackagePath(struct pipes_struct *p,
|
||
|
struct spoolss_GetPrinterDriverPackagePath *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10717,7 +10717,7 @@ WERROR _spoolss_GetPrinterDriverPackageP
|
||
|
WERROR _spoolss_69(struct pipes_struct *p,
|
||
|
struct spoolss_69 *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10728,7 +10728,7 @@ WERROR _spoolss_69(struct pipes_struct *
|
||
|
WERROR _spoolss_6a(struct pipes_struct *p,
|
||
|
struct spoolss_6a *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10739,7 +10739,7 @@ WERROR _spoolss_6a(struct pipes_struct *
|
||
|
WERROR _spoolss_6b(struct pipes_struct *p,
|
||
|
struct spoolss_6b *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10750,7 +10750,7 @@ WERROR _spoolss_6b(struct pipes_struct *
|
||
|
WERROR _spoolss_6c(struct pipes_struct *p,
|
||
|
struct spoolss_6c *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -10761,6 +10761,6 @@ WERROR _spoolss_6c(struct pipes_struct *
|
||
|
WERROR _spoolss_6d(struct pipes_struct *p,
|
||
|
struct spoolss_6d *r)
|
||
|
{
|
||
|
- p->rng_fault_state = true;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
|
||
|
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
|
||
|
@@ -2548,244 +2548,244 @@ WERROR _srvsvc_NetFileClose(struct pipes
|
||
|
WERROR _srvsvc_NetCharDevEnum(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevEnum *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevGetInfo(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevGetInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevControl(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevControl *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevQEnum(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevQEnum *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevQGetInfo(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevQGetInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevQSetInfo(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevQSetInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevQPurge(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevQPurge *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetCharDevQPurgeSelf(struct pipes_struct *p,
|
||
|
struct srvsvc_NetCharDevQPurgeSelf *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetFileGetInfo(struct pipes_struct *p,
|
||
|
struct srvsvc_NetFileGetInfo *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetShareCheck(struct pipes_struct *p,
|
||
|
struct srvsvc_NetShareCheck *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetServerStatisticsGet(struct pipes_struct *p,
|
||
|
struct srvsvc_NetServerStatisticsGet *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetTransportAdd(struct pipes_struct *p,
|
||
|
struct srvsvc_NetTransportAdd *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetTransportEnum(struct pipes_struct *p,
|
||
|
struct srvsvc_NetTransportEnum *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetTransportDel(struct pipes_struct *p,
|
||
|
struct srvsvc_NetTransportDel *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetSetServiceBits(struct pipes_struct *p,
|
||
|
struct srvsvc_NetSetServiceBits *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetPathType(struct pipes_struct *p,
|
||
|
struct srvsvc_NetPathType *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetPathCanonicalize(struct pipes_struct *p,
|
||
|
struct srvsvc_NetPathCanonicalize *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetPathCompare(struct pipes_struct *p,
|
||
|
struct srvsvc_NetPathCompare *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRPRNAMECANONICALIZE(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRPRNAMECANONICALIZE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetPRNameCompare(struct pipes_struct *p,
|
||
|
struct srvsvc_NetPRNameCompare *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetShareDelStart(struct pipes_struct *p,
|
||
|
struct srvsvc_NetShareDelStart *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetShareDelCommit(struct pipes_struct *p,
|
||
|
struct srvsvc_NetShareDelCommit *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetServerTransportAddEx(struct pipes_struct *p,
|
||
|
struct srvsvc_NetServerTransportAddEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NetServerSetServiceBitsEx(struct pipes_struct *p,
|
||
|
struct srvsvc_NetServerSetServiceBitsEx *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSGETVERSION(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSGETVERSION *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSSETSERVERINFO(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSSETSERVERINFO *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSCREATEEXITPOINT(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSCREATEEXITPOINT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSDELETEEXITPOINT(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSDELETEEXITPOINT *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSMODIFYPREFIX(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSMODIFYPREFIX *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(struct pipes_struct *p,
|
||
|
struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/svcctl/srv_svcctl_nt.c
|
||
|
+++ b/source3/rpc_server/svcctl/srv_svcctl_nt.c
|
||
|
@@ -1004,195 +1004,195 @@ WERROR _svcctl_SetServiceObjectSecurity(
|
||
|
WERROR _svcctl_DeleteService(struct pipes_struct *p,
|
||
|
struct svcctl_DeleteService *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_SetServiceStatus(struct pipes_struct *p,
|
||
|
struct svcctl_SetServiceStatus *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_NotifyBootConfigStatus(struct pipes_struct *p,
|
||
|
struct svcctl_NotifyBootConfigStatus *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_SCSetServiceBitsW(struct pipes_struct *p,
|
||
|
struct svcctl_SCSetServiceBitsW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_ChangeServiceConfigW(struct pipes_struct *p,
|
||
|
struct svcctl_ChangeServiceConfigW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_CreateServiceW(struct pipes_struct *p,
|
||
|
struct svcctl_CreateServiceW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_QueryServiceLockStatusW(struct pipes_struct *p,
|
||
|
struct svcctl_QueryServiceLockStatusW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_GetServiceKeyNameW(struct pipes_struct *p,
|
||
|
struct svcctl_GetServiceKeyNameW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_SCSetServiceBitsA(struct pipes_struct *p,
|
||
|
struct svcctl_SCSetServiceBitsA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_ChangeServiceConfigA(struct pipes_struct *p,
|
||
|
struct svcctl_ChangeServiceConfigA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_CreateServiceA(struct pipes_struct *p,
|
||
|
struct svcctl_CreateServiceA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_EnumDependentServicesA(struct pipes_struct *p,
|
||
|
struct svcctl_EnumDependentServicesA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_EnumServicesStatusA(struct pipes_struct *p,
|
||
|
struct svcctl_EnumServicesStatusA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_OpenSCManagerA(struct pipes_struct *p,
|
||
|
struct svcctl_OpenSCManagerA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_OpenServiceA(struct pipes_struct *p,
|
||
|
struct svcctl_OpenServiceA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_QueryServiceConfigA(struct pipes_struct *p,
|
||
|
struct svcctl_QueryServiceConfigA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_QueryServiceLockStatusA(struct pipes_struct *p,
|
||
|
struct svcctl_QueryServiceLockStatusA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_StartServiceA(struct pipes_struct *p,
|
||
|
struct svcctl_StartServiceA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_GetServiceDisplayNameA(struct pipes_struct *p,
|
||
|
struct svcctl_GetServiceDisplayNameA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_GetServiceKeyNameA(struct pipes_struct *p,
|
||
|
struct svcctl_GetServiceKeyNameA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_GetCurrentGroupeStateW(struct pipes_struct *p,
|
||
|
struct svcctl_GetCurrentGroupeStateW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_EnumServiceGroupW(struct pipes_struct *p,
|
||
|
struct svcctl_EnumServiceGroupW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_ChangeServiceConfig2A(struct pipes_struct *p,
|
||
|
struct svcctl_ChangeServiceConfig2A *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_ChangeServiceConfig2W(struct pipes_struct *p,
|
||
|
struct svcctl_ChangeServiceConfig2W *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_QueryServiceConfig2A(struct pipes_struct *p,
|
||
|
struct svcctl_QueryServiceConfig2A *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _EnumServicesStatusExA(struct pipes_struct *p,
|
||
|
struct EnumServicesStatusExA *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _EnumServicesStatusExW(struct pipes_struct *p,
|
||
|
struct EnumServicesStatusExW *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
WERROR _svcctl_SCSendTSMessage(struct pipes_struct *p,
|
||
|
struct svcctl_SCSendTSMessage *r)
|
||
|
{
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/winreg/srv_winreg_nt.c
|
||
|
+++ b/source3/rpc_server/winreg/srv_winreg_nt.c
|
||
|
@@ -760,7 +760,7 @@ WERROR _winreg_SaveKeyEx(struct pipes_st
|
||
|
/* fill in your code here if you think this call should
|
||
|
do anything */
|
||
|
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -948,7 +948,7 @@ WERROR _winreg_UnLoadKey(struct pipes_st
|
||
|
/* fill in your code here if you think this call should
|
||
|
do anything */
|
||
|
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -962,7 +962,7 @@ WERROR _winreg_ReplaceKey(struct pipes_s
|
||
|
/* fill in your code here if you think this call should
|
||
|
do anything */
|
||
|
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -976,7 +976,7 @@ WERROR _winreg_LoadKey(struct pipes_stru
|
||
|
/* fill in your code here if you think this call should
|
||
|
do anything */
|
||
|
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1139,6 +1139,6 @@ WERROR _winreg_DeleteKeyEx(struct pipes_
|
||
|
/* fill in your code here if you think this call should
|
||
|
do anything */
|
||
|
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
|
||
|
+++ b/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
|
||
|
@@ -405,7 +405,7 @@ WERROR _wkssvc_NetWkstaSetInfo(struct pi
|
||
|
struct wkssvc_NetWkstaSetInfo *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -608,7 +608,7 @@ WERROR _wkssvc_NetrWkstaUserGetInfo(stru
|
||
|
struct wkssvc_NetrWkstaUserGetInfo *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -619,7 +619,7 @@ WERROR _wkssvc_NetrWkstaUserSetInfo(stru
|
||
|
struct wkssvc_NetrWkstaUserSetInfo *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -630,7 +630,7 @@ WERROR _wkssvc_NetWkstaTransportEnum(str
|
||
|
struct wkssvc_NetWkstaTransportEnum *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -641,7 +641,7 @@ WERROR _wkssvc_NetrWkstaTransportAdd(str
|
||
|
struct wkssvc_NetrWkstaTransportAdd *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -652,7 +652,7 @@ WERROR _wkssvc_NetrWkstaTransportDel(str
|
||
|
struct wkssvc_NetrWkstaTransportDel *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -663,7 +663,7 @@ WERROR _wkssvc_NetrUseAdd(struct pipes_s
|
||
|
struct wkssvc_NetrUseAdd *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -674,7 +674,7 @@ WERROR _wkssvc_NetrUseGetInfo(struct pip
|
||
|
struct wkssvc_NetrUseGetInfo *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -685,7 +685,7 @@ WERROR _wkssvc_NetrUseDel(struct pipes_s
|
||
|
struct wkssvc_NetrUseDel *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -696,7 +696,7 @@ WERROR _wkssvc_NetrUseEnum(struct pipes_
|
||
|
struct wkssvc_NetrUseEnum *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -707,7 +707,7 @@ WERROR _wkssvc_NetrMessageBufferSend(str
|
||
|
struct wkssvc_NetrMessageBufferSend *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -718,7 +718,7 @@ WERROR _wkssvc_NetrWorkstationStatistics
|
||
|
struct wkssvc_NetrWorkstationStatisticsGet *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -729,7 +729,7 @@ WERROR _wkssvc_NetrLogonDomainNameAdd(st
|
||
|
struct wkssvc_NetrLogonDomainNameAdd *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -740,7 +740,7 @@ WERROR _wkssvc_NetrLogonDomainNameDel(st
|
||
|
struct wkssvc_NetrLogonDomainNameDel *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -751,7 +751,7 @@ WERROR _wkssvc_NetrJoinDomain(struct pip
|
||
|
struct wkssvc_NetrJoinDomain *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -762,7 +762,7 @@ WERROR _wkssvc_NetrUnjoinDomain(struct p
|
||
|
struct wkssvc_NetrUnjoinDomain *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -773,7 +773,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain
|
||
|
struct wkssvc_NetrRenameMachineInDomain *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -784,7 +784,7 @@ WERROR _wkssvc_NetrValidateName(struct p
|
||
|
struct wkssvc_NetrValidateName *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -795,7 +795,7 @@ WERROR _wkssvc_NetrGetJoinInformation(st
|
||
|
struct wkssvc_NetrGetJoinInformation *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -806,7 +806,7 @@ WERROR _wkssvc_NetrGetJoinableOus(struct
|
||
|
struct wkssvc_NetrGetJoinableOus *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -962,6 +962,7 @@ WERROR _wkssvc_NetrRenameMachineInDomain
|
||
|
struct wkssvc_NetrRenameMachineInDomain2 *r)
|
||
|
{
|
||
|
/* for now just return not supported */
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -972,7 +973,7 @@ WERROR _wkssvc_NetrValidateName2(struct
|
||
|
struct wkssvc_NetrValidateName2 *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -983,7 +984,7 @@ WERROR _wkssvc_NetrGetJoinableOus2(struc
|
||
|
struct wkssvc_NetrGetJoinableOus2 *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -994,7 +995,7 @@ WERROR _wkssvc_NetrAddAlternateComputerN
|
||
|
struct wkssvc_NetrAddAlternateComputerName *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1005,7 +1006,7 @@ WERROR _wkssvc_NetrRemoveAlternateComput
|
||
|
struct wkssvc_NetrRemoveAlternateComputerName *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1016,7 +1017,7 @@ WERROR _wkssvc_NetrSetPrimaryComputernam
|
||
|
struct wkssvc_NetrSetPrimaryComputername *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
|
||
|
@@ -1027,6 +1028,6 @@ WERROR _wkssvc_NetrEnumerateComputerName
|
||
|
struct wkssvc_NetrEnumerateComputerNames *r)
|
||
|
{
|
||
|
/* FIXME: Add implementation code here */
|
||
|
- p->rng_fault_state = True;
|
||
|
+ p->fault_state = DCERPC_FAULT_OP_RNG_ERROR;
|
||
|
return WERR_NOT_SUPPORTED;
|
||
|
}
|
||
|
--- a/libcli/auth/smbencrypt.c
|
||
|
+++ b/libcli/auth/smbencrypt.c
|
||
|
@@ -355,11 +355,18 @@ DATA_BLOB NTLMv2_generate_names_blob(TAL
|
||
|
DATA_BLOB names_blob = data_blob_talloc(mem_ctx, NULL, 0);
|
||
|
|
||
|
/* Deliberately ignore return here.. */
|
||
|
- (void)msrpc_gen(mem_ctx, &names_blob,
|
||
|
- "aaa",
|
||
|
- MsvAvNbDomainName, domain,
|
||
|
- MsvAvNbComputerName, hostname,
|
||
|
- MsvAvEOL, "");
|
||
|
+ if (hostname != NULL) {
|
||
|
+ (void)msrpc_gen(mem_ctx, &names_blob,
|
||
|
+ "aaa",
|
||
|
+ MsvAvNbDomainName, domain,
|
||
|
+ MsvAvNbComputerName, hostname,
|
||
|
+ MsvAvEOL, "");
|
||
|
+ } else {
|
||
|
+ (void)msrpc_gen(mem_ctx, &names_blob,
|
||
|
+ "aa",
|
||
|
+ MsvAvNbDomainName, domain,
|
||
|
+ MsvAvEOL, "");
|
||
|
+ }
|
||
|
return names_blob;
|
||
|
}
|
||
|
|