[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha8-131-gb85b93d

Günther Deschner gd at samba.org
Tue Jun 30 11:35:54 GMT 2009


The branch, master has been updated
       via  b85b93dcff89e18bd15d4cef8b8c2dc61bc42cbe (commit)
       via  e7d72b585a09f6b43df0f38ff20c74050069fb60 (commit)
       via  66780e016b13db8b88eb209f568aedac6e6cf740 (commit)
      from  9aff7b0b5934badcfe31296bc599f9d040f67811 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b85b93dcff89e18bd15d4cef8b8c2dc61bc42cbe
Author: Günther Deschner <gd at samba.org>
Date:   Tue Jun 30 13:12:01 2009 +0200

    s3-spoolss: Bug #6512. Fix support for enumerating user forms.
    
    Found while testing Xerox WorkCentre 133 PCL driver, now also tested with
    torture test.
    
    Guenther

commit e7d72b585a09f6b43df0f38ff20c74050069fb60
Author: Günther Deschner <gd at samba.org>
Date:   Tue Jun 30 13:11:16 2009 +0200

    s4-smbtorture: Test for newly added form with enum call in RPC-SPOOLSS.
    
    Guenther

commit 66780e016b13db8b88eb209f568aedac6e6cf740
Author: Günther Deschner <gd at samba.org>
Date:   Tue Jun 30 11:38:41 2009 +0200

    s4-smbtorture: remove trailing whitespace from RPC-SPOOLSS.
    
    Guenther

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

Summary of changes:
 source3/rpc_server/srv_spoolss_nt.c |   10 +-
 source4/torture/rpc/spoolss.c       |  241 +++++++++++++++++++++--------------
 2 files changed, 148 insertions(+), 103 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 899fed2..1ea92b4 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -7087,7 +7087,7 @@ static WERROR spoolss_enumforms_level1(TALLOC_CTX *mem_ctx,
 
 	/* construct the list of form structures */
 	for (i=0; i<num_builtin_forms; i++) {
-		DEBUGADD(6,("Filling form number [%d]\n",i));
+		DEBUGADD(6,("Filling builtin form number [%d]\n",i));
 		result = fill_form_info_1(info, &info[i].info1,
 					  &builtin_forms[i]);
 		if (!W_ERROR_IS_OK(result)) {
@@ -7095,10 +7095,10 @@ static WERROR spoolss_enumforms_level1(TALLOC_CTX *mem_ctx,
 		}
 	}
 
-	for (; i<num_user_forms; i++) {
-		DEBUGADD(6,("Filling form number [%d]\n",i));
-		result = fill_form_info_1(info, &info[i].info1,
-					  &user_forms[i-num_builtin_forms]);
+	for (i=0; i<num_user_forms; i++) {
+		DEBUGADD(6,("Filling user form number [%d]\n",i));
+		result = fill_form_info_1(info, &info[i+num_builtin_forms].info1,
+					  &user_forms[i]);
 		if (!W_ERROR_IS_OK(result)) {
 			goto out;
 		}
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 4640494..1c4b8ed 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -1,21 +1,22 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    test suite for spoolss rpc operations
 
    Copyright (C) Tim Potter 2003
    Copyright (C) Stefan Metzmacher 2005
    Copyright (C) Jelmer Vernooij 2007
-   
+   Copyright (C) Guenther Deschner 2009
+
    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/>.
 */
@@ -89,13 +90,13 @@ static bool test_OpenPrinter_server(struct torture_context *tctx, struct dcerpc_
 
 	status = dcerpc_spoolss_OpenPrinter(p, ctx, &op);
 	torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_OpenPrinter failed");
-	torture_assert_werr_ok(tctx, op.out.result, "dcerpc_spoolss_OpenPrinter failed"); 
+	torture_assert_werr_ok(tctx, op.out.result, "dcerpc_spoolss_OpenPrinter failed");
 
 	return true;
 }
 
-static bool test_EnumPorts(struct torture_context *tctx, 
-			   struct dcerpc_pipe *p, 
+static bool test_EnumPorts(struct torture_context *tctx,
+			   struct dcerpc_pipe *p,
 			   struct test_spoolss_context *ctx)
 {
 	NTSTATUS status;
@@ -126,7 +127,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
 			/* TODO: do some more checks here */
 			continue;
 		}
-		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
+		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPorts unexpected return code");
 
 		blob = data_blob_talloc(ctx, NULL, needed);
@@ -148,7 +149,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
 	for (i=1;i<ARRAY_SIZE(levels);i++) {
 		int level = levels[i];
 		int old_level = levels[i-1];
-		torture_assert_int_equal(tctx, ctx->port_count[level], ctx->port_count[old_level], 
+		torture_assert_int_equal(tctx, ctx->port_count[level], ctx->port_count[old_level],
 			"EnumPorts invalid value");
 	}
 	/* if the array sizes are not the same we would maybe segfault in the following code */
@@ -235,8 +236,8 @@ static bool test_GetPrintProcessorDirectory(struct torture_context *tctx,
 }
 
 
-static bool test_GetPrinterDriverDirectory(struct torture_context *tctx, 
-					   struct dcerpc_pipe *p, 
+static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
+					   struct dcerpc_pipe *p,
 					   struct test_spoolss_context *ctx)
 {
 	NTSTATUS status;
@@ -278,9 +279,9 @@ static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
 		torture_comment(tctx, "Testing GetPrinterDriverDirectory level %u\n", r.in.level);
 
 		status = dcerpc_spoolss_GetPrinterDriverDirectory(p, ctx, &r);
-		torture_assert_ntstatus_ok(tctx, status, 
+		torture_assert_ntstatus_ok(tctx, status,
 			"dcerpc_spoolss_GetPrinterDriverDirectory failed");
-		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
+		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"GetPrinterDriverDirectory unexpected return code");
 
 		blob = data_blob_talloc(ctx, NULL, needed);
@@ -297,7 +298,7 @@ static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_EnumPrinterDrivers(struct torture_context *tctx, 
+static bool test_EnumPrinterDrivers(struct torture_context *tctx,
 				    struct dcerpc_pipe *p,
 				    struct test_spoolss_context *ctx)
 {
@@ -334,7 +335,7 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
 		torture_comment(tctx, "Testing EnumPrinterDrivers level %u (%s)\n", r.in.level, r.in.environment);
 
 		status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r);
-		torture_assert_ntstatus_ok(tctx, status, 
+		torture_assert_ntstatus_ok(tctx, status,
 					   "dcerpc_spoolss_EnumPrinterDrivers failed");
 		if (W_ERROR_IS_OK(r.out.result)) {
 			/* TODO: do some more checks here */
@@ -444,8 +445,8 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_EnumMonitors(struct torture_context *tctx, 
-			      struct dcerpc_pipe *p, 
+static bool test_EnumMonitors(struct torture_context *tctx,
+			      struct dcerpc_pipe *p,
 			      struct test_spoolss_context *ctx)
 {
 	NTSTATUS status;
@@ -476,7 +477,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
 			/* TODO: do some more checks here */
 			continue;
 		}
-		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
+		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumMonitors failed");
 
 		blob = data_blob_talloc(ctx, NULL, needed);
@@ -496,7 +497,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
 	for (i=1;i<ARRAY_SIZE(levels);i++) {
 		int level = levels[i];
 		int old_level = levels[i-1];
-		torture_assert_int_equal(tctx, ctx->monitor_count[level], ctx->monitor_count[old_level], 
+		torture_assert_int_equal(tctx, ctx->monitor_count[level], ctx->monitor_count[old_level],
 					 "EnumMonitors invalid value");
 	}
 
@@ -519,7 +520,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_EnumPrintProcessors(struct torture_context *tctx, 
+static bool test_EnumPrintProcessors(struct torture_context *tctx,
 				     struct dcerpc_pipe *p,
 				     struct test_spoolss_context *ctx)
 {
@@ -552,7 +553,7 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
 			/* TODO: do some more checks here */
 			continue;
 		}
-		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
+		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPrintProcessors unexpected return code");
 
 		blob = data_blob_talloc(ctx, NULL, needed);
@@ -645,7 +646,7 @@ static bool test_EnumPrintProcDataTypes(struct torture_context *tctx,
 }
 
 
-static bool test_EnumPrinters(struct torture_context *tctx, 
+static bool test_EnumPrinters(struct torture_context *tctx,
 			      struct dcerpc_pipe *p,
 			      struct test_spoolss_context *ctx)
 {
@@ -678,7 +679,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
 			/* TODO: do some more checks here */
 			continue;
 		}
-		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, 
+		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPrinters unexpected return code");
 
 		blob = data_blob_talloc(ctx, NULL, needed);
@@ -714,7 +715,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
 				COMPARE_UINT32(tctx, cur->info0, ref->info2, cjobs);
 				/*COMPARE_UINT32(tctx, cur->info0, ref->info2, total_jobs);
 				COMPARE_UINT32(tctx, cur->info0, ref->info2, total_bytes);
-				COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, spoolss_Time time);		
+				COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, spoolss_Time time);
 				COMPARE_UINT32(tctx, cur->info0, ref->info2, global_counter);
 				COMPARE_UINT32(tctx, cur->info0, ref->info2, total_pages);
 				COMPARE_UINT32(tctx, cur->info0, ref->info2, version);
@@ -771,8 +772,8 @@ static bool test_EnumPrinters(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_GetPrinter(struct torture_context *tctx, 
-			    struct dcerpc_pipe *p, 
+static bool test_GetPrinter(struct torture_context *tctx,
+			    struct dcerpc_pipe *p,
 		     struct policy_handle *handle)
 {
 	NTSTATUS status;
@@ -780,7 +781,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
 	uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
 	int i;
 	uint32_t needed;
-	
+
 	for (i=0;i<ARRAY_SIZE(levels);i++) {
 		r.in.handle = handle;
 		r.in.level = levels[i];
@@ -792,7 +793,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
 
 		status = dcerpc_spoolss_GetPrinter(p, tctx, &r);
 		torture_assert_ntstatus_ok(tctx, status, "GetPrinter failed");
-		
+
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
 			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
 			data_blob_clear(&blob);
@@ -800,7 +801,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
 			r.in.offered = needed;
 			status = dcerpc_spoolss_GetPrinter(p, tctx, &r);
 		}
-		
+
 		torture_assert_ntstatus_ok(tctx, status, "GetPrinter failed");
 
 		torture_assert_werr_ok(tctx, r.out.result, "GetPrinter failed");
@@ -810,8 +811,8 @@ static bool test_GetPrinter(struct torture_context *tctx,
 }
 
 
-static bool test_ClosePrinter(struct torture_context *tctx, 
-			      struct dcerpc_pipe *p, 
+static bool test_ClosePrinter(struct torture_context *tctx,
+			      struct dcerpc_pipe *p,
 			      struct policy_handle *handle)
 {
 	NTSTATUS status;
@@ -828,9 +829,9 @@ static bool test_ClosePrinter(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_GetForm(struct torture_context *tctx, 
-			 struct dcerpc_pipe *p, 
-			 struct policy_handle *handle, 
+static bool test_GetForm(struct torture_context *tctx,
+			 struct dcerpc_pipe *p,
+			 struct policy_handle *handle,
 			 const char *form_name,
 			 uint32_t level)
 {
@@ -868,8 +869,8 @@ static bool test_GetForm(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_EnumForms(struct torture_context *tctx, 
-			   struct dcerpc_pipe *p, 
+static bool test_EnumForms(struct torture_context *tctx,
+			   struct dcerpc_pipe *p,
 			   struct policy_handle *handle, bool print_server)
 {
 	NTSTATUS status;
@@ -929,9 +930,9 @@ static bool test_EnumForms(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_DeleteForm(struct torture_context *tctx, 
-			    struct dcerpc_pipe *p, 
-			    struct policy_handle *handle, 
+static bool test_DeleteForm(struct torture_context *tctx,
+			    struct dcerpc_pipe *p,
+			    struct policy_handle *handle,
 			    const char *form_name)
 {
 	NTSTATUS status;
@@ -949,8 +950,8 @@ static bool test_DeleteForm(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_AddForm(struct torture_context *tctx, 
-			 struct dcerpc_pipe *p, 
+static bool test_AddForm(struct torture_context *tctx,
+			 struct dcerpc_pipe *p,
 			 struct policy_handle *handle, bool print_server)
 {
 	struct spoolss_AddForm r;
@@ -1003,6 +1004,50 @@ static bool test_AddForm(struct torture_context *tctx,
 
 	if (!print_server) ret &= test_GetForm(tctx, p, handle, form_name, 1);
 
+	{
+		struct spoolss_EnumForms e;
+		union spoolss_FormInfo *info;
+		uint32_t needed;
+		uint32_t count;
+		bool found = false;
+
+		e.in.handle = handle;
+		e.in.level = 1;
+		e.in.buffer = NULL;
+		e.in.offered = 0;
+		e.out.needed = &needed;
+		e.out.count = &count;
+		e.out.info = &info;
+
+		torture_comment(tctx, "Testing EnumForms level 1\n");
+
+		status = dcerpc_spoolss_EnumForms(p, tctx, &e);
+		torture_assert_ntstatus_ok(tctx, status, "EnumForms failed");
+
+		if (print_server && W_ERROR_EQUAL(e.out.result, WERR_BADFID))
+			torture_fail(tctx, "EnumForms on the PrintServer isn't supported by test server (NT4)");
+
+		if (W_ERROR_EQUAL(e.out.result, WERR_INSUFFICIENT_BUFFER)) {
+			int j;
+			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
+			data_blob_clear(&blob);
+			e.in.buffer = &blob;
+			e.in.offered = needed;
+
+			status = dcerpc_spoolss_EnumForms(p, tctx, &e);
+
+			torture_assert(tctx, info, "No forms returned");
+
+			for (j = 0; j < count; j++) {
+				if (strequal(form_name, info[j].info1.form_name)) {
+					found = true;
+					break;
+				}
+			}
+		}
+		torture_assert(tctx, found, "Newly added form not found in enum call");
+	}
+
 	if (!test_DeleteForm(tctx, p, handle, form_name)) {
 		ret = false;
 	}
@@ -1010,7 +1055,7 @@ static bool test_AddForm(struct torture_context *tctx,
 	return ret;
 }
 
-static bool test_EnumPorts_old(struct torture_context *tctx, 
+static bool test_EnumPorts_old(struct torture_context *tctx,
 			       struct dcerpc_pipe *p)
 {
 	NTSTATUS status;
@@ -1019,7 +1064,7 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
 	uint32_t count;
 	union spoolss_PortInfo *info;
 
-	r.in.servername = talloc_asprintf(tctx, "\\\\%s", 
+	r.in.servername = talloc_asprintf(tctx, "\\\\%s",
 					  dcerpc_server_name(p));
 	r.in.level = 2;
 	r.in.buffer = NULL;
@@ -1049,13 +1094,13 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_AddPort(struct torture_context *tctx, 
+static bool test_AddPort(struct torture_context *tctx,
 			 struct dcerpc_pipe *p)
 {
 	NTSTATUS status;
 	struct spoolss_AddPort r;
 
-	r.in.server_name = talloc_asprintf(tctx, "\\\\%s", 
+	r.in.server_name = talloc_asprintf(tctx, "\\\\%s",
 					   dcerpc_server_name(p));
 	r.in.unknown = 0;
 	r.in.monitor_name = "foo";
@@ -1080,8 +1125,8 @@ static bool test_AddPort(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_GetJob(struct torture_context *tctx, 
-			struct dcerpc_pipe *p, 
+static bool test_GetJob(struct torture_context *tctx,
+			struct dcerpc_pipe *p,
 			struct policy_handle *handle, uint32_t job_id)
 {
 	NTSTATUS status;
@@ -1129,9 +1174,9 @@ static bool test_GetJob(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_SetJob(struct torture_context *tctx, 
-			struct dcerpc_pipe *p, 
-			struct policy_handle *handle, uint32_t job_id, 
+static bool test_SetJob(struct torture_context *tctx,
+			struct dcerpc_pipe *p,
+			struct policy_handle *handle, uint32_t job_id,
 			enum spoolss_JobControl command)
 {
 	NTSTATUS status;
@@ -1210,8 +1255,8 @@ static bool test_AddJob(struct torture_context *tctx,
 }
 
 
-static bool test_EnumJobs(struct torture_context *tctx, 
-			  struct dcerpc_pipe *p, 
+static bool test_EnumJobs(struct torture_context *tctx,
+			  struct dcerpc_pipe *p,
 			  struct policy_handle *handle)
 {
 	NTSTATUS status;
@@ -1265,8 +1310,8 @@ static bool test_EnumJobs(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_DoPrintTest(struct torture_context *tctx, 
-			     struct dcerpc_pipe *p, 
+static bool test_DoPrintTest(struct torture_context *tctx,
+			     struct dcerpc_pipe *p,
 			     struct policy_handle *handle)
 {
 	bool ret = true;
@@ -1301,7 +1346,7 @@ static bool test_DoPrintTest(struct torture_context *tctx,
 		sp.in.handle		= handle;
 
 		status = dcerpc_spoolss_StartPagePrinter(p, tctx, &sp);
-		torture_assert_ntstatus_ok(tctx, status, 
+		torture_assert_ntstatus_ok(tctx, status,
 					   "dcerpc_spoolss_StartPagePrinter failed");
 		torture_assert_werr_ok(tctx, sp.out.result, "StartPagePrinter failed");
 
@@ -1340,8 +1385,8 @@ static bool test_DoPrintTest(struct torture_context *tctx,
 	return ret;
 }
 
-static bool test_PausePrinter(struct torture_context *tctx, 
-			      struct dcerpc_pipe *p, 
+static bool test_PausePrinter(struct torture_context *tctx,
+			      struct dcerpc_pipe *p,
 			      struct policy_handle *handle)
 {
 	NTSTATUS status;
@@ -1373,8 +1418,8 @@ static bool test_PausePrinter(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_ResumePrinter(struct torture_context *tctx, 
-			       struct dcerpc_pipe *p, 
+static bool test_ResumePrinter(struct torture_context *tctx,
+			       struct dcerpc_pipe *p,
 			       struct policy_handle *handle)
 {
 	NTSTATUS status;
@@ -1406,9 +1451,9 @@ static bool test_ResumePrinter(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_GetPrinterData(struct torture_context *tctx, 
-				struct dcerpc_pipe *p, 
-				struct policy_handle *handle, 
+static bool test_GetPrinterData(struct torture_context *tctx,
+				struct dcerpc_pipe *p,
+				struct policy_handle *handle,
 				const char *value_name)
 {
 	NTSTATUS status;
@@ -1441,9 +1486,9 @@ static bool test_GetPrinterData(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_GetPrinterDataEx(struct torture_context *tctx, 
-				  struct dcerpc_pipe *p, 
-				  struct policy_handle *handle, 
+static bool test_GetPrinterDataEx(struct torture_context *tctx,
+				  struct dcerpc_pipe *p,
+				  struct policy_handle *handle,
 				  const char *key_name,
 				  const char *value_name)
 {
@@ -1484,7 +1529,7 @@ static bool test_GetPrinterDataEx(struct torture_context *tctx,
 	return true;
 }
 
-static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p, 
+static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pipe *p,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list