The branch, master has been updated via d4f233a spoolss: fix handling of bad EnumJobs levels via 814b0ad torture/spoolss: test EnumJobs with an invalid level via e1b6d6e torture/spoolss: add werr_expected arg to EnumJobs helper from faa3423 s4-dns: Add support for BIND 9.10
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d4f233a746d89e13aae78008b499c71b695ff882 Author: David Disseldorp <dd...@samba.org> Date: Mon Oct 27 20:13:59 2014 +0100 spoolss: fix handling of bad EnumJobs levels Currently Samba is inconsistent when returning WERR_UNKNOWN_LEVEL errors for spoolss EnumJobs requests - if no print jobs are present, then WERR_OK will be returned, regardless of whether the EnumJobs level is supported or not. This change fixes this behaviour, by catching invalid or unsupported levels prior to the no-jobs response fast-path. Bug: https://bugzilla.samba.org/show_bug.cgi?id=10898 Signed-off-by: David Disseldorp <dd...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Tue Oct 28 03:05:35 CET 2014 on sn-devel-104 commit 814b0ade8c1aa62a15f896d2dc7091403a582968 Author: David Disseldorp <dd...@samba.org> Date: Mon Oct 27 20:13:58 2014 +0100 torture/spoolss: test EnumJobs with an invalid level This test confirms that EnumJobs WERR_INVALID_LEVEL responses remain consistent with and without the presence of outstanding print jobs. Signed-off-by: David Disseldorp <dd...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e1b6d6eab0824c74b409d00baef41ace8dac3449 Author: David Disseldorp <dd...@samba.org> Date: Mon Oct 27 20:13:57 2014 +0100 torture/spoolss: add werr_expected arg to EnumJobs helper This will allow for the future testing of specific EnumJobs failure cases. Signed-off-by: David Disseldorp <dd...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/rpc_server/spoolss/srv_spoolss_nt.c | 7 ++- source4/torture/rpc/spoolss.c | 89 +++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 7 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index b8a6d77..552d4cb 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -7338,6 +7338,11 @@ WERROR _spoolss_EnumJobs(struct pipes_struct *p, return WERR_INVALID_PARAM; } + if ((r->in.level != 1) && (r->in.level != 2) && (r->in.level != 3)) { + DEBUG(4, ("EnumJobs level %d not supported\n", r->in.level)); + return WERR_UNKNOWN_LEVEL; + } + DEBUG(4,("_spoolss_EnumJobs\n")); *r->out.needed = 0; @@ -7383,7 +7388,7 @@ WERROR _spoolss_EnumJobs(struct pipes_struct *p, pinfo2, r->out.info, r->out.count); break; default: - result = WERR_UNKNOWN_LEVEL; + SMB_ASSERT(false); /* level checked on entry */ break; } diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 83933c5..dea5549 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -3255,6 +3255,7 @@ static bool test_EnumJobs_args(struct torture_context *tctx, struct dcerpc_binding_handle *b, struct policy_handle *handle, uint32_t level, + WERROR werr_expected, uint32_t *count_p, union spoolss_JobInfo **info_p) { @@ -3288,13 +3289,15 @@ static bool test_EnumJobs_args(struct torture_context *tctx, status = dcerpc_spoolss_EnumJobs_r(b, tctx, &r); torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed"); - torture_assert_werr_ok(tctx, r.out.result, "EnumJobs failed"); + torture_assert_werr_equal(tctx, r.out.result, werr_expected, + "EnumJobs failed"); torture_assert(tctx, info, "No jobs returned"); CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumJobs, *r.out.info, r.in.level, count, needed, 4); } else { - torture_assert_werr_ok(tctx, r.out.result, "EnumJobs failed"); + torture_assert_werr_equal(tctx, r.out.result, werr_expected, + "EnumJobs failed"); } if (count_p) { @@ -3520,7 +3523,7 @@ static bool test_DoPrintTest_check_jobs(struct torture_context *tctx, "AddJob failed"); torture_assert(tctx, - test_EnumJobs_args(tctx, b, handle, 1, &count, &info), + test_EnumJobs_args(tctx, b, handle, 1, WERR_OK, &count, &info), "EnumJobs level 1 failed"); torture_assert_int_equal(tctx, count, num_jobs, "unexpected number of jobs in queue"); @@ -8305,7 +8308,8 @@ static bool test_print_test_smbd(struct torture_context *tctx, /* check back end spoolss job was created */ torture_assert(tctx, - test_EnumJobs_args(tctx, b, &t->handle, 1, &count, &info), + test_EnumJobs_args(tctx, b, &t->handle, 1, WERR_OK, + &count, &info), "EnumJobs level 1 failed"); for (i = 0; i < count; i++) { @@ -8352,7 +8356,8 @@ static bool test_print_test_purge(struct torture_context *tctx, } torture_assert(tctx, - test_EnumJobs_args(tctx, b, &t->handle, 1, &count, &info), + test_EnumJobs_args(tctx, b, &t->handle, 1, WERR_OK, + &count, &info), "EnumJobs level 1 failed"); torture_assert_int_equal(tctx, count, num_jobs, @@ -8363,7 +8368,8 @@ static bool test_print_test_purge(struct torture_context *tctx, "failed to purge printer"); torture_assert(tctx, - test_EnumJobs_args(tctx, b, &t->handle, 1, &count, &info), + test_EnumJobs_args(tctx, b, &t->handle, 1, WERR_OK, + &count, &info), "EnumJobs level 1 failed"); torture_assert_int_equal(tctx, count, 0, @@ -8843,6 +8849,76 @@ static bool test_driver_info_winreg(struct torture_context *tctx, return true; } +static bool test_print_job_enum(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; + bool ret = true; + uint32_t num_jobs = 8; + uint32_t *job_ids; + int i; + union spoolss_JobInfo *info = NULL; + uint32_t count; + + torture_assert(tctx, + test_PausePrinter(tctx, b, &t->handle), + "failed to pause printer"); + + /* enum before jobs, valid level */ + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 1, WERR_OK, + &count, &info), + "EnumJobs with valid level"); + torture_assert_int_equal(tctx, count, 0, "EnumJobs count"); + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 2, WERR_OK, + &count, &info), + "EnumJobs with valid level"); + torture_assert_int_equal(tctx, count, 0, "EnumJobs count"); + /* enum before jobs, invalid level - expect failure */ + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 100, + WERR_INVALID_LEVEL, + &count, &info), + "EnumJobs with invalid level"); + + job_ids = talloc_zero_array(tctx, uint32_t, num_jobs); + + for (i = 0; i < num_jobs; i++) { + ret = test_DoPrintTest_add_one_job(tctx, b, &t->handle, + "TorturePrintJob", + &job_ids[i]); + torture_assert(tctx, ret, "failed to add print job"); + } + + /* enum after jobs, valid level */ + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 1, WERR_OK, + &count, &info), + "EnumJobs with valid level"); + torture_assert_int_equal(tctx, count, num_jobs, "EnumJobs count"); + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 2, WERR_OK, + &count, &info), + "EnumJobs with valid level"); + torture_assert_int_equal(tctx, count, num_jobs, "EnumJobs count"); + /* enum after jobs, invalid level - expect failure */ + torture_assert(tctx, + test_EnumJobs_args(tctx, b, &t->handle, 100, + WERR_INVALID_LEVEL, + &count, &info), + "EnumJobs with invalid level"); + + torture_assert(tctx, + test_ResumePrinter(tctx, b, &t->handle), + "failed to resume printer"); + + return true; +} + void torture_tcase_printer(struct torture_tcase *tcase) { torture_tcase_add_simple_test(tcase, "openprinter", test_openprinter_wrap); @@ -8870,6 +8946,7 @@ void torture_tcase_printer(struct torture_tcase *tcase) torture_tcase_add_simple_test(tcase, "bidi", test_printer_bidi); torture_tcase_add_simple_test(tcase, "publish_toggle", test_printer_publish_toggle); + torture_tcase_add_simple_test(tcase, "print_job_enum", test_print_job_enum); } struct torture_suite *torture_rpc_spoolss_printer(TALLOC_CTX *mem_ctx) -- Samba Shared Repository