The branch, master has been updated via a149383... s3-spoolss: make sure AddPrinterDriver calls into AddPrinterDriverEx. via 587921b... s4-smbtorture: fix test_EnumPrinterDrivers_findone(). via 20133cf... s4-smbtorture: samba currently supports level 3 and 6 driver adds. from 413ffe9... s3-spoolss: fix some crash bugs and missing error codes in AddDriver paths.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit a14938377e42344eb04a3d3003199b231e88dc8d Author: Günther Deschner <g...@samba.org> Date: Fri Apr 23 03:04:47 2010 +0200 s3-spoolss: make sure AddPrinterDriver calls into AddPrinterDriverEx. Not vice versa. Also disable some info levels in AddPrinterDriver according to MS-RPRN 3.1.4.4.1. Found by torture test. Guenther commit 587921b7da93cc02386193ac4c3354db4717fa3f Author: Günther Deschner <g...@samba.org> Date: Fri Apr 23 03:03:59 2010 +0200 s4-smbtorture: fix test_EnumPrinterDrivers_findone(). Guenther commit 20133cfe560f2bd84b5c2ebab9dc25b0c98efeb9 Author: Günther Deschner <g...@samba.org> Date: Fri Apr 23 02:49:42 2010 +0200 s4-smbtorture: samba currently supports level 3 and 6 driver adds. Guenther ----------------------------------------------------------------------- Summary of changes: source3/rpc_server/srv_spoolss_nt.c | 46 ++++++++++++++++++++-------------- source4/torture/rpc/spoolss.c | 41 +++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 27 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 72499d8..e8b5f8e 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -7370,11 +7370,11 @@ WERROR _spoolss_AddPrinter(pipes_struct *p, } /**************************************************************** - _spoolss_AddPrinterDriver + _spoolss_AddPrinterDriverEx ****************************************************************/ -WERROR _spoolss_AddPrinterDriver(pipes_struct *p, - struct spoolss_AddPrinterDriver *r) +WERROR _spoolss_AddPrinterDriverEx(pipes_struct *p, + struct spoolss_AddPrinterDriverEx *r) { WERROR err = WERR_OK; char *driver_name = NULL; @@ -7392,6 +7392,18 @@ WERROR _spoolss_AddPrinterDriver(pipes_struct *p, return WERR_INVALID_PARAM; } + /* + * we only support the semantics of AddPrinterDriver() + * i.e. only copy files that are newer than existing ones + */ + + if (r->in.flags == 0) { + return WERR_INVALID_PARAM; + } + + if (r->in.flags != APD_COPY_NEW_FILES) { + return WERR_ACCESS_DENIED; + } /* FIXME */ if (r->in.info_ctr->level != 3 && r->in.info_ctr->level != 6) { @@ -7498,31 +7510,27 @@ done: } /**************************************************************** - _spoolss_AddPrinterDriverEx + _spoolss_AddPrinterDriver ****************************************************************/ -WERROR _spoolss_AddPrinterDriverEx(pipes_struct *p, - struct spoolss_AddPrinterDriverEx *r) +WERROR _spoolss_AddPrinterDriver(pipes_struct *p, + struct spoolss_AddPrinterDriver *r) { - struct spoolss_AddPrinterDriver a; - - /* - * we only support the semantics of AddPrinterDriver() - * i.e. only copy files that are newer than existing ones - */ - - if (r->in.flags == 0) { - return WERR_INVALID_PARAM; - } + struct spoolss_AddPrinterDriverEx a; - if (r->in.flags != APD_COPY_NEW_FILES) { - return WERR_ACCESS_DENIED; + switch (r->in.info_ctr->level) { + case 6: + case 8: + return WERR_UNKNOWN_LEVEL; + default: + break; } a.in.servername = r->in.servername; a.in.info_ctr = r->in.info_ctr; + a.in.flags = APD_COPY_NEW_FILES; - return _spoolss_AddPrinterDriver(p, &a); + return _spoolss_AddPrinterDriverEx(p, &a); } /**************************************************************************** diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c046f18..711f4df 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -532,28 +532,28 @@ static bool test_EnumPrinterDrivers_findone(struct torture_context *tctx, const char *driver_name_ret; switch (level) { case 1: - driver_name_ret = info->info1.driver_name; + driver_name_ret = info[i].info1.driver_name; break; case 2: - driver_name_ret = info->info2.driver_name; + driver_name_ret = info[i].info2.driver_name; break; case 3: - driver_name_ret = info->info3.driver_name; + driver_name_ret = info[i].info3.driver_name; break; case 4: - driver_name_ret = info->info4.driver_name; + driver_name_ret = info[i].info4.driver_name; break; case 5: - driver_name_ret = info->info5.driver_name; + driver_name_ret = info[i].info5.driver_name; break; case 6: - driver_name_ret = info->info6.driver_name; + driver_name_ret = info[i].info6.driver_name; break; case 7: - driver_name_ret = info->info7.driver_name; + driver_name_ret = info[i].info7.driver_name; break; case 8: - driver_name_ret = info->info8.driver_name; + driver_name_ret = info[i].info8.driver_name; break; default: break; @@ -7307,6 +7307,18 @@ static bool test_add_driver_arg(struct torture_context *tctx, for (i=0; i < ARRAY_SIZE(levels); i++) { + if (torture_setting_bool(tctx, "samba3", false)) { + switch (levels[i]) { + case 2: + case 4: + case 8: + torture_comment(tctx, "skipping level %d against samba\n", levels[i]); + continue; + default: + break; + } + } + torture_comment(tctx, "Testing PrinterDriver%s '%s' add & delete level %d\n", d->ex ? "Ex" : "", info8.driver_name, levels[i]); @@ -7320,6 +7332,19 @@ static bool test_add_driver_arg(struct torture_context *tctx, for (i=0; i < ARRAY_SIZE(levels); i++) { + if (torture_setting_bool(tctx, "samba3", false)) { + switch (levels[i]) { + case 2: + case 4: + case 8: + torture_comment(tctx, "skipping level %d against samba\n", levels[i]); + continue; + default: + break; + } + } + + torture_comment(tctx, "Testing PrinterDriver%s '%s' add & delete level %d (full unc paths)\n", d->ex ? "Ex" : "", info8.driver_name, levels[i]); -- Samba Shared Repository