[SCM] Samba Shared Repository - branch v3-6-test updated

Günther Deschner gd at samba.org
Fri Jan 28 14:11:14 MST 2011


The branch, v3-6-test has been updated
       via  e7535f1 s3-net: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
       via  aad03ea s3-rpcclient: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
      from  2b78be9 We need to reply to SMB2_GETINFO_FILE with a class of SMB2_FILE_STANDARD_INFO on an IPC$ share.

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


- Log -----------------------------------------------------------------
commit e7535f1472e4465ced667536b365f193a2caf8f5
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 28 18:17:00 2011 +0100

    s3-net: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
    
    This is a workaround for a string issue we currently have with argument based
    generated dcerpc client code (see bug #7804 for details).
    
    Guenther
    
    Autobuild-User: Günther Deschner <gd at samba.org>
    Autobuild-Date: Fri Jan 28 22:05:20 CET 2011 on sn-devel-104
    (cherry picked from commit fc16baaf91f21addb42d41d60a1d0453c00843b2)

commit aad03ea3c45d366a76b1757b8fcd9fc316dcf82a
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 28 18:07:07 2011 +0100

    s3-rpcclient: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
    
    This is a workaround for a string issue we currently have with argument based
    generated dcerpc client code (see bug #7804 for details).
    
    Guenther
    (cherry picked from commit d4414f08cb5e52d03ddd07b21d07cb4e9516c53c)

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

Summary of changes:
 source3/rpcclient/cmd_spoolss.c |   85 ++++++++++++++++++--------------------
 source3/utils/net_rpc_printer.c |   76 +++++++++++++++-------------------
 2 files changed, 74 insertions(+), 87 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index 3e6752c..248996e 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -2972,17 +2972,13 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
 {
 	WERROR result;
 	NTSTATUS status;
-	uint32_t i = 0;
 	const char *printername;
 	struct policy_handle hnd;
-	uint32_t value_offered = 0;
-	const char *value_name = NULL;
 	uint32_t value_needed;
 	enum winreg_Type type;
-	uint8_t *data = NULL;
-	uint32_t data_offered = 0;
 	uint32_t data_needed;
 	struct dcerpc_binding_handle *b = cli->binding_handle;
+	struct spoolss_EnumPrinterData r;
 
 	if (argc != 2) {
 		printf("Usage: %s printername\n", argv[0]);
@@ -3003,53 +2999,55 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
 
 	/* Enumerate data */
 
-	status = dcerpc_spoolss_EnumPrinterData(b, mem_ctx,
-						&hnd,
-						i,
-						value_name,
-						value_offered,
-						&value_needed,
-						&type,
-						data,
-						data_offered,
-						&data_needed,
-						&result);
-
+	r.in.handle = &hnd;
+	r.in.enum_index = 0;
+	r.in.value_offered = 0;
+	r.in.data_offered = 0;
+	r.out.value_name = NULL;
+	r.out.value_needed = &value_needed;
+	r.out.type = &type;
+	r.out.data = NULL;
+	r.out.data_needed = &data_needed;
+
+	status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
 	if (!NT_STATUS_IS_OK(status)) {
 		result = ntstatus_to_werror(status);
 		goto done;
 	}
 
-	if (!W_ERROR_IS_OK(result)) {
+	if (!W_ERROR_IS_OK(r.out.result)) {
+		result = r.out.result;
 		goto done;
 	}
 
-	data_offered	= data_needed;
-	value_offered	= value_needed;
-	data		= talloc_zero_array(mem_ctx, uint8_t, data_needed);
-	value_name	= talloc_zero_array(mem_ctx, char, value_needed);
+	r.in.data_offered	= *r.out.data_needed;
+	r.in.value_offered	= *r.out.value_needed;
+	r.out.data		= talloc_zero_array(mem_ctx, uint8_t, r.in.data_offered);
+	r.out.value_name	= talloc_zero_array(mem_ctx, char, r.in.value_offered);
+
+	do {
+
+		status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
+		if (!NT_STATUS_IS_OK(status)) {
+			result = ntstatus_to_werror(status);
+			goto done;
+		}
+
+		if (W_ERROR_EQUAL(r.out.result, WERR_NO_MORE_ITEMS)) {
+			result = WERR_OK;
+			break;
+		}
 
-	while (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
+		r.in.enum_index++;
 
-		status = dcerpc_spoolss_EnumPrinterData(b, mem_ctx,
-							&hnd,
-							i++,
-							value_name,
-							value_offered,
-							&value_needed,
-							&type,
-							data,
-							data_offered,
-							&data_needed,
-							&result);
-		if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
+		{
 			struct regval_blob *v;
 
 			v = regval_compose(talloc_tos(),
-					   value_name,
-					   type,
-					   data,
-					   data_offered);
+					   r.out.value_name,
+					   *r.out.type,
+					   r.out.data,
+					   r.in.data_offered);
 			if (v == NULL) {
 				result = WERR_NOMEM;
 				goto done;
@@ -3058,11 +3056,8 @@ static WERROR cmd_spoolss_enum_data(struct rpc_pipe_client *cli,
 			display_reg_value(v);
 			talloc_free(v);
 		}
-	}
 
-	if (W_ERROR_V(result) == ERRnomoreitems) {
-		result = W_ERROR(ERRsuccess);
-	}
+	} while (W_ERROR_IS_OK(r.out.result));
 
 done:
 	if (is_valid_policy_hnd(&hnd)) {
diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c
index 24442fe..0375490 100644
--- a/source3/utils/net_rpc_printer.c
+++ b/source3/utils/net_rpc_printer.c
@@ -2255,7 +2255,7 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct net_context *c,
 
 	WERROR result;
 	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-	uint32_t i = 0, p = 0, j = 0;
+	uint32_t i = 0, j = 0;
 	uint32_t num_printers;
 	uint32_t level = 2;
 	const char *printername, *sharename;
@@ -2306,11 +2306,10 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct net_context *c,
 	/* do something for all printers */
 	for (i = 0; i < num_printers; i++) {
 
-		uint32_t value_offered = 0, value_needed;
-		uint32_t data_offered = 0, data_needed;
+		uint32_t value_needed;
+		uint32_t data_needed;
 		enum winreg_Type type;
-		uint8_t *buffer = NULL;
-		const char *value_name = NULL;
+		struct spoolss_EnumPrinterData r;
 
 		/* do some initialization */
 		printername = info_enum[i].info2.printername;
@@ -2402,50 +2401,43 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct net_context *c,
 		   FIXME: IIRC I've seen it too on a win2k-server
 		*/
 
+		r.in.handle = &hnd_src;
+		r.in.enum_index = 0;
+		r.in.value_offered = 0;
+		r.in.data_offered = 0;
+		r.out.value_name = NULL;
+		r.out.value_needed = &value_needed;
+		r.out.type = &type;
+		r.out.data = NULL;
+		r.out.data_needed = &data_needed;
+
 		/* enumerate data on src handle */
-		nt_status = dcerpc_spoolss_EnumPrinterData(b_src, mem_ctx,
-							   &hnd_src,
-							   p,
-							   value_name,
-							   value_offered,
-							   &value_needed,
-							   &type,
-							   buffer,
-							   data_offered,
-							   &data_needed,
-							   &result);
-
-		data_offered	= data_needed;
-		value_offered	= value_needed;
-		buffer		= talloc_zero_array(mem_ctx, uint8_t, data_needed);
-		value_name	= talloc_zero_array(mem_ctx, char, value_needed);
+		nt_status = dcerpc_spoolss_EnumPrinterData_r(b_src, mem_ctx, &r);
+
+		r.in.data_offered	= *r.out.data_needed;
+		r.in.value_offered	= *r.out.value_needed;
+		r.out.data		= talloc_zero_array(mem_ctx, uint8_t, r.in.data_offered);
+		r.out.value_name	= talloc_zero_array(mem_ctx, char, r.in.value_offered);
 
 		/* loop for all printerdata of "PrinterDriverData" */
-		while (NT_STATUS_IS_OK(nt_status) && W_ERROR_IS_OK(result)) {
-
-			nt_status = dcerpc_spoolss_EnumPrinterData(b_src, mem_ctx,
-								   &hnd_src,
-								   p++,
-								   value_name,
-								   value_offered,
-								   &value_needed,
-								   &type,
-								   buffer,
-								   data_offered,
-								   &data_needed,
-								   &result);
+		while (NT_STATUS_IS_OK(nt_status) && W_ERROR_IS_OK(r.out.result)) {
+
+			r.in.enum_index++;
+
+			nt_status = dcerpc_spoolss_EnumPrinterData_r(b_src, mem_ctx, &r);
+
 			/* loop for all reg_keys */
-			if (NT_STATUS_IS_OK(nt_status) && W_ERROR_IS_OK(result)) {
+			if (NT_STATUS_IS_OK(nt_status) && W_ERROR_IS_OK(r.out.result)) {
 
 				/* display_value */
 				if (c->opt_verbose) {
 					struct regval_blob *v;
 
 					v = regval_compose(talloc_tos(),
-							   value_name,
-							   type,
-							   buffer,
-							   data_offered);
+							   r.out.value_name,
+							   *r.out.type,
+							   r.out.data,
+							   r.in.data_offered);
 					if (v == NULL) {
 						nt_status = NT_STATUS_NO_MEMORY;
 						goto done;
@@ -2457,12 +2449,12 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct net_context *c,
 
 				/* set_value */
 				if (!net_spoolss_setprinterdata(pipe_hnd_dst, mem_ctx,
-								&hnd_dst, value_name,
-								type, buffer, data_offered))
+								&hnd_dst, r.out.value_name,
+								*r.out.type, r.out.data, r.in.data_offered))
 					goto done;
 
 				DEBUGADD(1,("\tSetPrinterData of [%s] succeeded\n",
-					    value_name));
+					    r.out.value_name));
 			}
 		}
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list