[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-452-g9024aec

Günther Deschner gd at samba.org
Wed Mar 26 18:31:25 GMT 2008


The branch, v3-2-test has been updated
       via  9024aecdbf5d4df9996625f0cc8ce8a5ecdd247e (commit)
       via  5d0aa3bbf8e56f5d2a1ab4d037d7fd146b095f9d (commit)
       via  42971b71acec9c9fd94011c06d41702dac6b4f87 (commit)
       via  4abe30fdae511422dccd04d0287d962192beadcb (commit)
      from  9ef9d4c4e77523d7f3cc5fdac199559896e585bd (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 9024aecdbf5d4df9996625f0cc8ce8a5ecdd247e
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 26 19:27:18 2008 +0100

    Re-run make idl.
    
    Guenther

commit 5d0aa3bbf8e56f5d2a1ab4d037d7fd146b095f9d
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 26 19:25:54 2008 +0100

    Fix IDL for netr_NETLOGON_INFO_2.
    
    W2k8 generated NT_STATUS_ARRAY_BOUNDS_EXCEEDED errors while validating trusts.
    
    Guenther

commit 42971b71acec9c9fd94011c06d41702dac6b4f87
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 26 19:18:08 2008 +0100

    Fix _netr_LogonControl2(). Return talloced dcname.
    
    Guenther

commit 4abe30fdae511422dccd04d0287d962192beadcb
Author: Günther Deschner <gd at samba.org>
Date:   Mon Feb 18 02:40:55 2008 +0100

    Add ntsvcs_getdevregprop command to rpcclient.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source/librpc/gen_ndr/ndr_netlogon.c |   47 ++++++++++++++++++++++++---------
 source/librpc/gen_ndr/netlogon.h     |    2 +-
 source/librpc/idl/netlogon.idl       |    2 +-
 source/rpc_server/srv_netlog_nt.c    |   14 +++++++---
 source/rpcclient/cmd_ntsvcs.c        |   40 ++++++++++++++++++++++++++++
 5 files changed, 86 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/librpc/gen_ndr/ndr_netlogon.c b/source/librpc/gen_ndr/ndr_netlogon.c
index 4c46fb0..a898be6 100644
--- a/source/librpc/gen_ndr/ndr_netlogon.c
+++ b/source/librpc/gen_ndr/ndr_netlogon.c
@@ -5420,33 +5420,49 @@ static enum ndr_err_code ndr_push_netr_NETLOGON_INFO_2(struct ndr_push *ndr, int
 		NDR_CHECK(ndr_push_align(ndr, 4));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->pdc_connection_status));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->trusted_dc_name, CH_UTF16)));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->trusted_dc_name, CH_UTF16)));
-		NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->trusted_dc_name, ndr_charset_length(r->trusted_dc_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		NDR_CHECK(ndr_push_unique_ptr(ndr, r->trusted_dc_name));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->tc_connection_status));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
+		if (r->trusted_dc_name) {
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->trusted_dc_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->trusted_dc_name, CH_UTF16)));
+			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->trusted_dc_name, ndr_charset_length(r->trusted_dc_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
+		}
 	}
 	return NDR_ERR_SUCCESS;
 }
 
 static enum ndr_err_code ndr_pull_netr_NETLOGON_INFO_2(struct ndr_pull *ndr, int ndr_flags, struct netr_NETLOGON_INFO_2 *r)
 {
+	uint32_t _ptr_trusted_dc_name;
+	TALLOC_CTX *_mem_save_trusted_dc_name_0;
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_pull_align(ndr, 4));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->flags));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->pdc_connection_status));
-		NDR_CHECK(ndr_pull_array_size(ndr, &r->trusted_dc_name));
-		NDR_CHECK(ndr_pull_array_length(ndr, &r->trusted_dc_name));
-		if (ndr_get_array_length(ndr, &r->trusted_dc_name) > ndr_get_array_size(ndr, &r->trusted_dc_name)) {
-			return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->trusted_dc_name), ndr_get_array_length(ndr, &r->trusted_dc_name));
+		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_trusted_dc_name));
+		if (_ptr_trusted_dc_name) {
+			NDR_PULL_ALLOC(ndr, r->trusted_dc_name);
+		} else {
+			r->trusted_dc_name = NULL;
 		}
-		NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->trusted_dc_name), sizeof(uint16_t)));
-		NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->trusted_dc_name, ndr_get_array_length(ndr, &r->trusted_dc_name), sizeof(uint16_t), CH_UTF16));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->tc_connection_status));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
+		if (r->trusted_dc_name) {
+			_mem_save_trusted_dc_name_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->trusted_dc_name, 0);
+			NDR_CHECK(ndr_pull_array_size(ndr, &r->trusted_dc_name));
+			NDR_CHECK(ndr_pull_array_length(ndr, &r->trusted_dc_name));
+			if (ndr_get_array_length(ndr, &r->trusted_dc_name) > ndr_get_array_size(ndr, &r->trusted_dc_name)) {
+				return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->trusted_dc_name), ndr_get_array_length(ndr, &r->trusted_dc_name));
+			}
+			NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->trusted_dc_name), sizeof(uint16_t)));
+			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->trusted_dc_name, ndr_get_array_length(ndr, &r->trusted_dc_name), sizeof(uint16_t), CH_UTF16));
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_trusted_dc_name_0, 0);
+		}
 	}
 	return NDR_ERR_SUCCESS;
 }
@@ -5457,7 +5473,12 @@ _PUBLIC_ void ndr_print_netr_NETLOGON_INFO_2(struct ndr_print *ndr, const char *
 	ndr->depth++;
 	ndr_print_uint32(ndr, "flags", r->flags);
 	ndr_print_uint32(ndr, "pdc_connection_status", r->pdc_connection_status);
-	ndr_print_string(ndr, "trusted_dc_name", r->trusted_dc_name);
+	ndr_print_ptr(ndr, "trusted_dc_name", r->trusted_dc_name);
+	ndr->depth++;
+	if (r->trusted_dc_name) {
+		ndr_print_string(ndr, "trusted_dc_name", r->trusted_dc_name);
+	}
+	ndr->depth--;
 	ndr_print_uint32(ndr, "tc_connection_status", r->tc_connection_status);
 	ndr->depth--;
 }
@@ -5543,7 +5564,7 @@ static enum ndr_err_code ndr_push_netr_CONTROL_QUERY_INFORMATION(struct ndr_push
 
 			case 2:
 				if (r->info2) {
-					NDR_CHECK(ndr_push_netr_NETLOGON_INFO_2(ndr, NDR_SCALARS, r->info2));
+					NDR_CHECK(ndr_push_netr_NETLOGON_INFO_2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
 				}
 			break;
 
@@ -5623,7 +5644,7 @@ static enum ndr_err_code ndr_pull_netr_CONTROL_QUERY_INFORMATION(struct ndr_pull
 				if (r->info2) {
 					_mem_save_info2_0 = NDR_PULL_GET_MEM_CTX(ndr);
 					NDR_PULL_SET_MEM_CTX(ndr, r->info2, 0);
-					NDR_CHECK(ndr_pull_netr_NETLOGON_INFO_2(ndr, NDR_SCALARS, r->info2));
+					NDR_CHECK(ndr_pull_netr_NETLOGON_INFO_2(ndr, NDR_SCALARS|NDR_BUFFERS, r->info2));
 					NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info2_0, 0);
 				}
 			break;
diff --git a/source/librpc/gen_ndr/netlogon.h b/source/librpc/gen_ndr/netlogon.h
index 058e5e7..434e989 100644
--- a/source/librpc/gen_ndr/netlogon.h
+++ b/source/librpc/gen_ndr/netlogon.h
@@ -580,7 +580,7 @@ struct netr_NETLOGON_INFO_1 {
 struct netr_NETLOGON_INFO_2 {
 	uint32_t flags;
 	uint32_t pdc_connection_status;
-	const char *trusted_dc_name;/* [charset(UTF16)] */
+	const char *trusted_dc_name;/* [unique,charset(UTF16)] */
 	uint32_t tc_connection_status;
 };
 
diff --git a/source/librpc/idl/netlogon.idl b/source/librpc/idl/netlogon.idl
index 5979701..2a7b14c 100644
--- a/source/librpc/idl/netlogon.idl
+++ b/source/librpc/idl/netlogon.idl
@@ -776,7 +776,7 @@ interface netlogon
 	typedef struct {
 		uint32 flags;
 		uint32 pdc_connection_status;
-		[string,charset(UTF16)] uint16 trusted_dc_name[];
+		[string,charset(UTF16)] uint16 *trusted_dc_name;
 		uint32 tc_connection_status;
 	} netr_NETLOGON_INFO_2;
 
diff --git a/source/rpc_server/srv_netlog_nt.c b/source/rpc_server/srv_netlog_nt.c
index 5b26f55..f4967dc 100644
--- a/source/rpc_server/srv_netlog_nt.c
+++ b/source/rpc_server/srv_netlog_nt.c
@@ -136,7 +136,8 @@ WERROR _netr_LogonControl2(pipes_struct *p,
         uint32 pdc_connection_status = 0x0;
         uint32 logon_attempts = 0x0;
         uint32 tc_status;
-	fstring dc_name, dc_name2;
+	fstring dc_name2;
+	const char *dc_name = NULL;
 	struct sockaddr_storage dc_ss;
 	const char *domain = NULL;
 	struct netr_NETLOGON_INFO_1 *info1;
@@ -144,7 +145,6 @@ WERROR _netr_LogonControl2(pipes_struct *p,
 	struct netr_NETLOGON_INFO_3 *info3;
 
 	tc_status = W_ERROR_V(WERR_NO_SUCH_DOMAIN);
-	fstrcpy( dc_name, "" );
 
 	switch (r->in.function_code) {
 		case NETLOGON_CONTROL_TC_QUERY:
@@ -158,7 +158,10 @@ WERROR _netr_LogonControl2(pipes_struct *p,
 				break;
 			}
 
-			fstr_sprintf( dc_name, "\\\\%s", dc_name2 );
+			dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2);
+			if (!dc_name) {
+				return WERR_NOMEM;
+			}
 
 			tc_status = W_ERROR_V(WERR_OK);
 
@@ -175,7 +178,10 @@ WERROR _netr_LogonControl2(pipes_struct *p,
 				break;
 			}
 
-			fstr_sprintf( dc_name, "\\\\%s", dc_name2 );
+			dc_name = talloc_asprintf(p->mem_ctx, "\\\\%s", dc_name2);
+			if (!dc_name) {
+				return WERR_NOMEM;
+			}
 
 			tc_status = W_ERROR_V(WERR_OK);
 
diff --git a/source/rpcclient/cmd_ntsvcs.c b/source/rpcclient/cmd_ntsvcs.c
index b7b37e2..7fd9e79 100644
--- a/source/rpcclient/cmd_ntsvcs.c
+++ b/source/rpcclient/cmd_ntsvcs.c
@@ -177,6 +177,45 @@ static WERROR cmd_ntsvcs_get_hw_prof_info(struct rpc_pipe_client *cli,
 	return werr;
 }
 
+static WERROR cmd_ntsvcs_get_dev_reg_prop(struct rpc_pipe_client *cli,
+					  TALLOC_CTX *mem_ctx,
+					  int argc,
+					  const char **argv)
+{
+	NTSTATUS status;
+	WERROR werr;
+	const char *devicepath = NULL;
+	uint32_t property = DEV_REGPROP_DESC;
+	uint32_t unknown1 = 0;
+	uint8_t buffer;
+	uint32_t buffer_size = 0;
+	uint32_t unknown2 = 0;
+	uint32_t unknown3 = 0;
+
+	if (argc < 2) {
+		printf("usage: %s [devicepath]\n", argv[0]);
+		return WERR_OK;
+	}
+
+	devicepath = argv[1];
+
+	status = rpccli_PNP_GetDeviceRegProp(cli, mem_ctx,
+					     devicepath,
+					     property,
+					     &unknown1,
+					     &buffer,
+					     &buffer_size,
+					     &unknown2,
+					     unknown3,
+					     &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		return ntstatus_to_werror(status);
+	}
+
+	return werr;
+}
+
+
 struct cmd_set ntsvcs_commands[] = {
 
 	{ "NTSVCS" },
@@ -185,5 +224,6 @@ struct cmd_set ntsvcs_commands[] = {
 	{ "ntsvcs_getdevlistsize", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_device_list_size, PI_NTSVCS, NULL, "Query NTSVCS get device list", "" },
 	{ "ntsvcs_hwprofflags", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_hw_prof_flags, PI_NTSVCS, NULL, "Query NTSVCS HW prof flags", "" },
 	{ "ntsvcs_hwprofinfo", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_hw_prof_info, PI_NTSVCS, NULL, "Query NTSVCS HW prof info", "" },
+	{ "ntsvcs_getdevregprop", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_dev_reg_prop, PI_NTSVCS, NULL, "Query NTSVCS device registry property", "" },
 	{ NULL }
 };


-- 
Samba Shared Repository


More information about the samba-cvs mailing list