[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Thu Dec 3 15:50:12 MST 2009


The branch, master has been updated
       via  459a968... s3-spoolss: handle SEC_FLAG_MAXIMUM_ALLOWED in spoolss_OpenPrinterEx.
       via  2f0548f... s4-smbtorture: check more WERRORs in RPC-SPOOLSS.
      from  4e20a6f... s4-smbtorture: call test_EnumPrinterDrivers with architecture in RPC-SPOOLSS.

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


- Log -----------------------------------------------------------------
commit 459a968fb4d6f96ea7f310f331d3547e2e466d6a
Author: Günther Deschner <gd at samba.org>
Date:   Thu Dec 3 23:23:36 2009 +0100

    s3-spoolss: handle SEC_FLAG_MAXIMUM_ALLOWED in spoolss_OpenPrinterEx.
    
    In case someone (smbtorture4) requests SEC_FLAG_MAXIMUM_ALLOWED, translate it
    to a request of PRINTER_ACCESS_ADMINISTER.
    
    Guenther

commit 2f0548fd98ccbe9695d4e6ae0e21e5ceca76ac68
Author: Günther Deschner <gd at samba.org>
Date:   Thu Dec 3 22:38:38 2009 +0100

    s4-smbtorture: check more WERRORs in RPC-SPOOLSS.
    
    Guenther

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

Summary of changes:
 source3/rpc_server/srv_spoolss_nt.c |    4 ++
 source4/torture/rpc/spoolss.c       |   69 ++++++++++++++++++-----------------
 2 files changed, 39 insertions(+), 34 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 4a3f07f..5b8a208 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -1676,6 +1676,10 @@ WERROR _spoolss_OpenPrinterEx(pipes_struct *p,
 			return WERR_BADFID;
 		}
 
+		if (r->in.access_mask == SEC_FLAG_MAXIMUM_ALLOWED) {
+			r->in.access_mask = PRINTER_ACCESS_ADMINISTER;
+		}
+
 		se_map_standard(&r->in.access_mask, &printer_std_mapping);
 
 		/* map an empty access mask to the minimum access mask */
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 1de3266..f0ecb65 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -1372,6 +1372,7 @@ static bool test_ClosePrinter(struct torture_context *tctx,
 
 	status = dcerpc_spoolss_ClosePrinter(p, tctx, &r);
 	torture_assert_ntstatus_ok(tctx, status, "ClosePrinter failed");
+	torture_assert_werr_ok(tctx, r.out.result, "ClosePrinter failed");
 
 	return true;
 }
@@ -1634,10 +1635,13 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
 
 		status = dcerpc_spoolss_EnumPorts(p, tctx, &r);
 		torture_assert_ntstatus_ok(tctx, status, "EnumPorts failed");
+		torture_assert_werr_ok(tctx, r.out.result, "EnumPorts failed");
 
 		torture_assert(tctx, info, "No ports returned");
 	}
 
+	torture_assert_werr_ok(tctx, r.out.result, "EnumPorts failed");
+
 	return true;
 }
 
@@ -1842,11 +1846,14 @@ static bool test_EnumJobs(struct torture_context *tctx,
 
 		status = dcerpc_spoolss_EnumJobs(p, tctx, &r);
 
+		torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
+		torture_assert_werr_ok(tctx, r.out.result, "EnumJobs failed");
 		torture_assert(tctx, info, "No jobs returned");
 
 		for (j = 0; j < count; j++) {
 
-			test_GetJob(tctx, p, handle, info[j].info1.job_id);
+			torture_assert(tctx, test_GetJob(tctx, p, handle, info[j].info1.job_id),
+				"failed to call test_GetJob");
 
 			/* FIXME - gd */
 			if (!torture_setting_bool(tctx, "samba3", false)) {
@@ -2109,6 +2116,10 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip
 		status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r);
 
 		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed");
+		if (W_ERROR_EQUAL(r.out.result, WERR_NO_MORE_ITEMS)) {
+			break;
+		}
+		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterData");
 
 		r.in.value_offered = value_size;
 		r.out.value_name = talloc_zero_array(tctx, const char, value_size);
@@ -2118,6 +2129,11 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip
 		status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r);
 
 		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed");
+		if (W_ERROR_EQUAL(r.out.result, WERR_NO_MORE_ITEMS)) {
+			break;
+		}
+
+		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterData failed");
 
 		torture_assert(tctx, test_GetPrinterData(tctx, p, handle, r.out.value_name),
 			talloc_asprintf(tctx, "failed to call GetPrinterData for %s\n", r.out.value_name));
@@ -2134,7 +2150,8 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip
 
 static bool test_EnumPrinterDataEx(struct torture_context *tctx,
 				   struct dcerpc_pipe *p,
-				   struct policy_handle *handle)
+				   struct policy_handle *handle,
+				   const char *key_name)
 {
 	NTSTATUS status;
 	struct spoolss_EnumPrinterDataEx r;
@@ -2143,22 +2160,23 @@ static bool test_EnumPrinterDataEx(struct torture_context *tctx,
 	uint32_t count;
 
 	r.in.handle = handle;
-	r.in.key_name = "PrinterDriverData";
+	r.in.key_name = key_name;
 	r.in.offered = 0;
 	r.out.needed = &needed;
 	r.out.count = &count;
 	r.out.info = &info;
 
-	torture_comment(tctx, "Testing EnumPrinterDataEx\n");
-
-	status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r);
-	torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed");
+	torture_comment(tctx, "Testing EnumPrinterDataEx(%s)\n", key_name);
 
-	r.in.offered = needed;
-
-	status = dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r);
+	torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
+		"EnumPrinterDataEx failed");
+	if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+		r.in.offered = needed;
+		torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
+			"EnumPrinterDataEx failed");
+	}
 
-	torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDataEx failed");
+	torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDataEx failed");
 
 	return true;
 }
@@ -2180,6 +2198,7 @@ static bool test_DeletePrinterData(struct torture_context *tctx,
 	status = dcerpc_spoolss_DeletePrinterData(p, tctx, &r);
 
 	torture_assert_ntstatus_ok(tctx, status, "DeletePrinterData failed");
+	torture_assert_werr_ok(tctx, r.out.result, "DeletePrinterData failed");
 
 	return true;
 }
@@ -2197,11 +2216,12 @@ static bool test_SetPrinterData(struct torture_context *tctx,
 	r.in.type = REG_SZ;
 	r.in.data.string = "dog";
 
-	torture_comment(tctx, "Testing SetPrinterData\n");
+	torture_comment(tctx, "Testing SetPrinterData(%s)\n", value_name);
 
 	status = dcerpc_spoolss_SetPrinterData(p, tctx, &r);
 
 	torture_assert_ntstatus_ok(tctx, status, "SetPrinterData failed");
+	torture_assert_werr_ok(tctx, r.out.result, "SetPrinterData failed");
 
 	if (!test_GetPrinterData(tctx, p, handle, value_name)) {
 		return false;
@@ -2415,7 +2435,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx,
 		ret = false;
 	}
 
-	if (!test_EnumPrinterDataEx(tctx, p, &handle)) {
+	if (!test_EnumPrinterDataEx(tctx, p, &handle, "PrinterDriverData")) {
 		ret = false;
 	}
 
@@ -3058,27 +3078,8 @@ bool test_printer_keys(struct torture_context *tctx,
 	}
 
 	for (i=0; key_array && key_array[i]; i++) {
-		struct spoolss_EnumPrinterDataEx r;
-		uint32_t count;
-		struct spoolss_PrinterEnumValues *info;
-		uint32_t needed;
-
-		r.in.handle = handle;
-		r.in.key_name = key_array[i];
-		r.in.offered = 0;
-		r.out.count = &count;
-		r.out.info = &info;
-		r.out.needed = &needed;
-
-		torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
-			"failed to call EnumPrinterDataEx");
-		if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
-			r.in.offered = needed;
-			torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
-				"failed to call EnumPrinterDataEx");
-		}
-		torture_assert_werr_ok(tctx, r.out.result,
-			"failed to call EnumPrinterDataEx");
+		torture_assert(tctx, test_EnumPrinterDataEx(tctx, p, handle, key_array[i]),
+			"failed to call test_EnumPrinterDataEx");
 	}
 
 	return true;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list