[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