[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Mon Oct 11 09:13:07 MDT 2010


The branch, master has been updated
       via  df7523c pidl: fix minor typo in s3 server generation.
       via  33c6a4e s3-spoolss: add more userlevel info validation to _spoolss_OpenPrinterEx.
       via  025290e s3-spoolss: let set_printer_hnd_name return WERROR.
       via  c8a295a s3-spoolss: convert open_printer_hnd to return WERROR.
       via  fe724c7 s3-spoolss: fix set_printer_hnd_name() to match torture test.
       via  43d226f s4-smbtorture: add test for openprinter printername pattern.
      from  6633a7b unit tests: do some cleanup after tests

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


- Log -----------------------------------------------------------------
commit df7523c79208cc374060787f726f9066007d88ea
Author: Günther Deschner <gd at samba.org>
Date:   Mon Oct 11 12:38:05 2010 +0200

    pidl: fix minor typo in s3 server generation.
    
    Guenther
    
    Autobuild-User: Günther Deschner <gd at samba.org>
    Autobuild-Date: Mon Oct 11 15:12:57 UTC 2010 on sn-devel-104

commit 33c6a4eb8a0017db9d7b3cc337142fd1d08b5da5
Author: Günther Deschner <gd at samba.org>
Date:   Mon Oct 11 11:33:23 2010 +0200

    s3-spoolss: add more userlevel info validation to _spoolss_OpenPrinterEx.
    
    Guenther

commit 025290e9bf0f7597dc8d849a221fd80f140c1f7a
Author: Günther Deschner <gd at samba.org>
Date:   Mon Oct 4 20:27:20 2010 +0200

    s3-spoolss: let set_printer_hnd_name return WERROR.
    
    Guenther

commit c8a295ab7f1ba96b1a1f44004b581770c0da51ad
Author: Günther Deschner <gd at samba.org>
Date:   Mon Oct 4 11:02:52 2010 +0200

    s3-spoolss: convert open_printer_hnd to return WERROR.
    
    Guenther

commit fe724c70d2b8b916cb7ca77b7370d77e8e5b80de
Author: Günther Deschner <gd at samba.org>
Date:   Sat Oct 2 22:14:37 2010 +0200

    s3-spoolss: fix set_printer_hnd_name() to match torture test.
    
    Guenther

commit 43d226fa25746a99ff598be6f0d663c8c11b7d97
Author: Günther Deschner <gd at samba.org>
Date:   Sat Oct 2 22:13:44 2010 +0200

    s4-smbtorture: add test for openprinter printername pattern.
    
    Guenther

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

Summary of changes:
 pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm |    2 +-
 source3/rpc_server/srv_spoolss_nt.c     |   92 +++++++++++++--------
 source4/torture/rpc/spoolss.c           |  131 ++++++++++++++++++++++++++++++-
 3 files changed, 187 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm b/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
index 1cbf187..0ebccf5 100644
--- a/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
+++ b/pidl/lib/Parse/Pidl/Samba3/ServerNDR.pm
@@ -190,7 +190,7 @@ sub ParseFunction($$)
 	pidl "}";
 	pidl "";
 	pidl "if (DEBUGLEVEL >= 10) {";
-	pidl "\nNDR_PRINT_FUNCTION_DEBUG($fn->{NAME}, NDR_OUT | NDR_SET_VALUES, r);";
+	pidl "\tNDR_PRINT_FUNCTION_DEBUG($fn->{NAME}, NDR_OUT | NDR_SET_VALUES, r);";
 	pidl "}";
 	pidl "";
 	pidl "push = ndr_push_init_ctx(r);";
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index c05ba66..3783d0f 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -532,11 +532,11 @@ static void prune_printername_cache(void)
  XcvDataPort() interface.
 ****************************************************************************/
 
-static bool set_printer_hnd_name(TALLOC_CTX *mem_ctx,
-				 const struct auth_serversupplied_info *server_info,
-				 struct messaging_context *msg_ctx,
-				 struct printer_handle *Printer,
-				 const char *handlename)
+static WERROR set_printer_hnd_name(TALLOC_CTX *mem_ctx,
+				   const struct auth_serversupplied_info *server_info,
+				   struct messaging_context *msg_ctx,
+				   struct printer_handle *Printer,
+				   const char *handlename)
 {
 	int snum;
 	int n_services=lp_numservices();
@@ -568,36 +568,42 @@ static bool set_printer_hnd_name(TALLOC_CTX *mem_ctx,
 			aprinter++;
 		}
 		if (!is_myname_or_ipaddr(servername)) {
-			return false;
+			return WERR_INVALID_PRINTER_NAME;
 		}
 		Printer->servername = talloc_asprintf(Printer, "\\\\%s", servername);
 		if (Printer->servername == NULL) {
-			return false;
+			return WERR_NOMEM;
 		}
 	}
 
 	if (Printer->printer_type == SPLHND_SERVER) {
-		return true;
+		return WERR_OK;
 	}
 
 	if (Printer->printer_type != SPLHND_PRINTER) {
-		return false;
+		return WERR_INVALID_HANDLE;
 	}
 
 	DEBUGADD(5, ("searching for [%s]\n", aprinter));
 
-	if ((p = strchr(aprinter, ',')) != NULL) {
-		if (*p == ' ')
+	p = strchr(aprinter, ',');
+	if (p != NULL) {
+		char *p2 = p;
+		p++;
+		if (*p == ' ') {
 			p++;
-		if (strnequal(p+1, "DrvConvert", strlen("DrvConvert")) ||
-		    strnequal(p+1, " DrvConvert", strlen(" DrvConvert"))) {
-			*p = '\0';
-		} else if (strnequal(p+1, "LocalOnly", strlen("LocalOnly")) ||
-		           strnequal(p+1, " LocalOnly", strlen(" LocalOnly"))) {
-			*p = '\0';
+		}
+		if (strncmp(p, "DrvConvert", strlen("DrvConvert")) == 0) {
+			*p2 = '\0';
+		} else if (strncmp(p, "LocalOnly", strlen("LocalOnly")) == 0) {
+			*p2 = '\0';
 		}
 	}
 
+	if (p) {
+		DEBUGADD(5, ("stripped handlename: [%s]\n", aprinter));
+	}
+
 	/* check for the Port Monitor Interface */
 	if ( strequal( aprinter, SPL_XCV_MONITOR_TCPMON ) ) {
 		Printer->printer_type = SPLHND_PORTMON_TCP;
@@ -625,7 +631,7 @@ static bool set_printer_hnd_name(TALLOC_CTX *mem_ctx,
 		if (!found) {
 			DEBUG(4, ("Printer %s not found\n", aprinter));
 			SAFE_FREE(tmp);
-			return false;
+			return WERR_INVALID_PRINTER_NAME;
 		}
 		fstrcpy(sname, tmp);
 		SAFE_FREE(tmp);
@@ -696,7 +702,7 @@ static bool set_printer_hnd_name(TALLOC_CTX *mem_ctx,
 			TALLOC_FREE(cache_key);
 		}
 		DEBUGADD(4,("Printer not found\n"));
-		return false;
+		return WERR_INVALID_PRINTER_NAME;
 	}
 
 	if (cache_key != NULL) {
@@ -708,30 +714,33 @@ static bool set_printer_hnd_name(TALLOC_CTX *mem_ctx,
 
 	fstrcpy(Printer->sharename, sname);
 
-	return true;
+	return WERR_OK;
 }
 
 /****************************************************************************
  Find first available printer slot. creates a printer handle for you.
  ****************************************************************************/
 
-static bool open_printer_hnd(struct pipes_struct *p, struct policy_handle *hnd,
-			     const char *name, uint32_t access_granted)
+static WERROR open_printer_hnd(struct pipes_struct *p,
+			       struct policy_handle *hnd,
+			       const char *name,
+			       uint32_t access_granted)
 {
 	struct printer_handle *new_printer;
+	WERROR result;
 
 	DEBUG(10,("open_printer_hnd: name [%s]\n", name));
 
 	new_printer = talloc_zero(p->mem_ctx, struct printer_handle);
 	if (new_printer == NULL) {
-		return false;
+		return WERR_NOMEM;
 	}
 	talloc_set_destructor(new_printer, printer_entry_destructor);
 
 	/* This also steals the printer_handle on the policy_handle */
 	if (!create_policy_hnd(p, hnd, new_printer)) {
 		TALLOC_FREE(new_printer);
-		return false;
+		return WERR_INVALID_HANDLE;
 	}
 
 	/* Add to the internal list. */
@@ -741,15 +750,16 @@ static bool open_printer_hnd(struct pipes_struct *p, struct policy_handle *hnd,
 
 	if (!set_printer_hnd_printertype(new_printer, name)) {
 		close_printer_handle(p, hnd);
-		return false;
+		return WERR_INVALID_HANDLE;
 	}
 
-	if (!set_printer_hnd_name(p->mem_ctx,
-				  get_server_info_system(),
-				  p->msg_ctx,
-				  new_printer, name)) {
+	result = set_printer_hnd_name(p->mem_ctx,
+				      get_server_info_system(),
+				      p->msg_ctx,
+				      new_printer, name);
+	if (!W_ERROR_IS_OK(result)) {
 		close_printer_handle(p, hnd);
-		return false;
+		return result;
 	}
 
 	new_printer->access_granted = access_granted;
@@ -757,7 +767,7 @@ static bool open_printer_hnd(struct pipes_struct *p, struct policy_handle *hnd,
 	DEBUG(5, ("%d printer handles active\n",
 		  (int)num_pipe_handles(p)));
 
-	return true;
+	return WERR_OK;
 }
 
 /***************************************************************************
@@ -1677,21 +1687,32 @@ WERROR _spoolss_OpenPrinterEx(struct pipes_struct *p,
 {
 	int snum;
 	struct printer_handle *Printer=NULL;
+	WERROR result;
 
 	if (!r->in.printername) {
 		return WERR_INVALID_PARAM;
 	}
 
+	if (r->in.level < 0 || r->in.level > 3) {
+		return WERR_INVALID_PARAM;
+	}
+	if ((r->in.level == 1 && !r->in.userlevel.level1) ||
+	    (r->in.level == 2 && !r->in.userlevel.level2) ||
+	    (r->in.level == 3 && !r->in.userlevel.level3)) {
+		return WERR_INVALID_PARAM;
+	}
+
 	/* some sanity check because you can open a printer or a print server */
 	/* aka: \\server\printer or \\server */
 
 	DEBUGADD(3,("checking name: %s\n", r->in.printername));
 
-	if (!open_printer_hnd(p, r->out.handle, r->in.printername, 0)) {
+	result = open_printer_hnd(p, r->out.handle, r->in.printername, 0);
+	if (!W_ERROR_IS_OK(result)) {
 		DEBUG(0,("_spoolss_OpenPrinterEx: Cannot open a printer handle "
 			"for printer %s\n", r->in.printername));
 		ZERO_STRUCTP(r->out.handle);
-		return WERR_INVALID_PARAM;
+		return result;
 	}
 
 	Printer = find_printer_index_by_hnd(p, r->out.handle);
@@ -7847,10 +7868,11 @@ static WERROR spoolss_addprinterex_level_2(struct pipes_struct *p,
 		return err;
 	}
 
-	if (!open_printer_hnd(p, handle, info2->printername, PRINTER_ACCESS_ADMINISTER)) {
+	err = open_printer_hnd(p, handle, info2->printername, PRINTER_ACCESS_ADMINISTER);
+	if (!W_ERROR_IS_OK(err)) {
 		/* Handle open failed - remove addition. */
 		ZERO_STRUCTP(handle);
-		return WERR_ACCESS_DENIED;
+		return err;
 	}
 
 	return WERR_OK;
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index de4ca83..8154cd2 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -5777,10 +5777,8 @@ static bool call_OpenPrinterEx(struct torture_context *tctx,
 			       struct spoolss_DeviceMode *devmode,
 			       struct policy_handle *handle)
 {
-	struct spoolss_OpenPrinterEx r;
 	union spoolss_UserLevel userlevel;
 	struct spoolss_UserLevel1 userlevel1;
-	NTSTATUS status;
 	struct dcerpc_binding_handle *b = p->binding_handle;
 
 	userlevel1.size = 1234;
@@ -5896,6 +5894,118 @@ static bool test_printer_rename(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_openprinter(struct torture_context *tctx,
+			     struct dcerpc_binding_handle *b,
+			     const char *real_printername)
+{
+	union spoolss_UserLevel userlevel;
+	struct policy_handle handle;
+	struct spoolss_UserLevel1 userlevel1;
+	const char *printername = NULL;
+	int i;
+
+	struct {
+		const char *suffix;
+		WERROR expected_result;
+	} tests[] = {
+		{
+			.suffix			= "rubbish",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", LocalOnl",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", localOnly",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", localonl",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ",LocalOnl",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ",localOnl2",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", DrvConver2t",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", drvconvert",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ",drvconvert",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ", DrvConvert",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= " , DrvConvert",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ",DrvConvert",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= ", DrvConvertsadfasdf",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= ",DrvConvertasdfasd",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= ", LocalOnly",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= " , LocalOnly",
+			.expected_result	= WERR_INVALID_PRINTER_NAME
+		},{
+			.suffix			= ",LocalOnly",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= ", LocalOnlysagi4gjfkd",
+			.expected_result	= WERR_OK
+		},{
+			.suffix			= ",LocalOnlysagi4gjfkd",
+			.expected_result	= WERR_OK
+		}
+	};
+
+	userlevel1.size = 1234;
+	userlevel1.client = "hello";
+	userlevel1.user = "spottyfoot!";
+	userlevel1.build = 1;
+	userlevel1.major = 2;
+	userlevel1.minor = 3;
+	userlevel1.processor = 4;
+
+	userlevel.level1 = &userlevel1;
+
+	torture_comment(tctx, "Testing openprinterex printername pattern\n");
+
+	torture_assert(tctx,
+		test_OpenPrinterEx(tctx, b, real_printername, NULL, NULL, 0, 1,
+				   &userlevel, &handle,
+				   WERR_OK),
+		"OpenPrinterEx failed");
+	test_ClosePrinter(tctx, b, &handle);
+
+	for (i=0; i < ARRAY_SIZE(tests); i++) {
+
+		printername = talloc_asprintf(tctx, "%s%s",
+					      real_printername,
+					      tests[i].suffix);
+
+		torture_assert(tctx,
+			test_OpenPrinterEx(tctx, b, printername, NULL, NULL, 0, 1,
+					   &userlevel, &handle,
+					   tests[i].expected_result),
+			"OpenPrinterEx failed");
+		if (W_ERROR_IS_OK(tests[i].expected_result)) {
+			test_ClosePrinter(tctx, b, &handle);
+		}
+	}
+
+	return true;
+}
+
 
 static bool test_existing_printer_openprinterex(struct torture_context *tctx,
 						struct dcerpc_pipe *p,
@@ -5906,6 +6016,10 @@ static bool test_existing_printer_openprinterex(struct torture_context *tctx,
 	bool ret = true;
 	struct dcerpc_binding_handle *b = p->binding_handle;
 
+	if (!test_openprinter(tctx, b, name)) {
+		return false;
+	}
+
 	if (!call_OpenPrinterEx(tctx, p, name, NULL, &handle)) {
 		return false;
 	}
@@ -6895,6 +7009,18 @@ bool test_printer_all_keys(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_openprinter_wrap(struct torture_context *tctx,
+				  void *private_data)
+{
+	struct torture_printer_context *t =
+		(struct torture_printer_context *)talloc_get_type_abort(private_data, struct torture_printer_context);
+	struct dcerpc_pipe *p = t->spoolss_pipe;
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	const char *printername = t->info2.printername;
+
+	return test_openprinter(tctx, b, printername);
+}
+
 static bool test_csetprinter(struct torture_context *tctx,
 			     void *private_data)
 {
@@ -7636,6 +7762,7 @@ static bool test_driver_info_winreg(struct torture_context *tctx,
 
 void torture_tcase_printer(struct torture_tcase *tcase)
 {
+	torture_tcase_add_simple_test(tcase, "openprinter", test_openprinter_wrap);
 	torture_tcase_add_simple_test(tcase, "csetprinter", test_csetprinter);
 	torture_tcase_add_simple_test(tcase, "print_test", test_print_test);
 	torture_tcase_add_simple_test(tcase, "print_test_extended", test_print_test_extended);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list