The branch, master has been updated via 46b6afc s4-torture: add ndr64 spoolss openprinterex to ndr test. via 6cdf59d s4-torture: allow to do ndr tests with flags, not only ndr_flags. via a4dcf7b spoolss: Make OpenPrinterEx work with NDR64 by using UserInfo Container. from 6bb7bf9 test: dbwrap_tool requires --persistent for the registry now
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 46b6afc69baf89ba346e4418452b2d5a49b3e322 Author: Günther Deschner <g...@samba.org> Date: Tue Jan 15 17:05:10 2013 +0100 s4-torture: add ndr64 spoolss openprinterex to ndr test. Guenther Signed-off-by: Günther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org> Autobuild-Date(master): Wed Jan 16 13:26:53 CET 2013 on sn-devel-104 commit 6cdf59d716eb41c8ce67ff55aa661eaa09fa2e1b Author: Günther Deschner <g...@samba.org> Date: Tue Jan 15 17:04:08 2013 +0100 s4-torture: allow to do ndr tests with flags, not only ndr_flags. Guenther Signed-off-by: Günther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit a4dcf7b94d8f2d8180bb5b390f49e89e2c956a88 Author: Günther Deschner <g...@samba.org> Date: Mon Jan 14 17:26:31 2013 +0100 spoolss: Make OpenPrinterEx work with NDR64 by using UserInfo Container. Guenther Signed-off-by: Günther Deschner <g...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: librpc/idl/spoolss.idl | 3 +- source3/rpc_client/cli_spoolss.c | 8 +++--- source3/rpc_server/spoolss/srv_spoolss_nt.c | 14 ++++++---- source4/rpc_server/spoolss/dcesrv_spoolss.c | 5 +-- source4/torture/ndr/ndr.c | 5 ++++ source4/torture/ndr/ndr.h | 12 +++++++-- source4/torture/ndr/spoolss.c | 28 +++++++++++++++++++++ source4/torture/rpc/samba3rpc.c | 8 +++--- source4/torture/rpc/spoolss.c | 35 +++++++++++++-------------- source4/torture/rpc/spoolss_access.c | 4 +- source4/torture/rpc/spoolss_win.c | 8 +++--- 11 files changed, 84 insertions(+), 46 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index 06a0935..7d8e8de 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -2821,8 +2821,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") [in,unique] [string,charset(UTF16)] uint16 *datatype, [in] spoolss_DevmodeContainer devmode_ctr, [in] spoolss_AccessRights access_mask, - [in] uint32 level, - [in,switch_is(level)] spoolss_UserLevel userlevel, + [in] spoolss_UserLevelCtr userlevel_ctr, [out,ref] policy_handle *handle ); diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c index 5c8448b..1a8903d 100644 --- a/source3/rpc_client/cli_spoolss.c +++ b/source3/rpc_client/cli_spoolss.c @@ -40,7 +40,7 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli, NTSTATUS status; WERROR werror; struct spoolss_DevmodeContainer devmode_ctr; - union spoolss_UserLevel userlevel; + struct spoolss_UserLevelCtr userlevel_ctr; struct spoolss_UserLevel1 level1; struct dcerpc_binding_handle *b = cli->binding_handle; @@ -55,15 +55,15 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli, level1.minor = 0; level1.processor = 0; - userlevel.level1 = &level1; + userlevel_ctr.level = 1; + userlevel_ctr.user_info.level1 = &level1; status = dcerpc_spoolss_OpenPrinterEx(b, mem_ctx, printername, NULL, devmode_ctr, access_desired, - 1, /* level */ - userlevel, + userlevel_ctr, handle, &werror); diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 28ef836..48a2981 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -1632,15 +1632,17 @@ WERROR _spoolss_OpenPrinter(struct pipes_struct *p, struct spoolss_OpenPrinter *r) { struct spoolss_OpenPrinterEx e; + struct spoolss_UserLevel1 level1; WERROR werr; - ZERO_STRUCT(e.in.userlevel); + ZERO_STRUCT(level1); e.in.printername = r->in.printername; e.in.datatype = r->in.datatype; e.in.devmode_ctr = r->in.devmode_ctr; e.in.access_mask = r->in.access_mask; - e.in.level = 0; + e.in.userlevel_ctr.level = 1; + e.in.userlevel_ctr.user_info.level1 = &level1; e.out.handle = r->out.handle; @@ -1714,12 +1716,12 @@ WERROR _spoolss_OpenPrinterEx(struct pipes_struct *p, return WERR_INVALID_PARAM; } - if (r->in.level > 3) { + if (r->in.userlevel_ctr.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)) { + if ((r->in.userlevel_ctr.level == 1 && !r->in.userlevel_ctr.user_info.level1) || + (r->in.userlevel_ctr.level == 2 && !r->in.userlevel_ctr.user_info.level2) || + (r->in.userlevel_ctr.level == 3 && !r->in.userlevel_ctr.user_info.level3)) { return WERR_INVALID_PARAM; } diff --git a/source4/rpc_server/spoolss/dcesrv_spoolss.c b/source4/rpc_server/spoolss/dcesrv_spoolss.c index 76035f3..e3df4e0 100644 --- a/source4/rpc_server/spoolss/dcesrv_spoolss.c +++ b/source4/rpc_server/spoolss/dcesrv_spoolss.c @@ -269,9 +269,8 @@ static WERROR dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TAL r2->in.datatype = r->in.datatype; r2->in.devmode_ctr = r->in.devmode_ctr; r2->in.access_mask = r->in.access_mask; - r2->in.level = 1; - r2->in.userlevel.level1 = NULL; - + r2->in.userlevel_ctr.level = 1; + r2->in.userlevel_ctr.user_info.level1 = NULL; r2->out.handle = r->out.handle; /* TODO: we should take care about async replies here, diff --git a/source4/torture/ndr/ndr.c b/source4/torture/ndr/ndr.c index a7e580f..30cd46a 100644 --- a/source4/torture/ndr/ndr.c +++ b/source4/torture/ndr/ndr.c @@ -31,6 +31,7 @@ struct ndr_pull_test_data { ndr_pull_flags_fn_t pull_fn; ndr_push_flags_fn_t push_fn; int ndr_flags; + int flags; }; static bool wrap_ndr_pullpush_test(struct torture_context *tctx, @@ -43,6 +44,8 @@ static bool wrap_ndr_pullpush_test(struct torture_context *tctx, void *ds = talloc_zero_size(ndr, data->struct_size); bool ret; + ndr->flags |= data->flags; + ndr->flags |= LIBNDR_FLAG_REF_ALLOC; torture_assert_ndr_success(tctx, data->pull_fn(ndr, data->ndr_flags, ds), @@ -76,6 +79,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( DATA_BLOB db, size_t struct_size, int ndr_flags, + int flags, bool (*check_fn) (struct torture_context *ctx, void *data)) { struct torture_test *test; @@ -93,6 +97,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( data = talloc(test, struct ndr_pull_test_data); data->data = db; data->ndr_flags = ndr_flags; + data->flags = flags; data->struct_size = struct_size; data->pull_fn = pull_fn; data->push_fn = push_fn; diff --git a/source4/torture/ndr/ndr.h b/source4/torture/ndr/ndr.h index ee4db0a..068d5f6 100644 --- a/source4/torture/ndr/ndr.h +++ b/source4/torture/ndr/ndr.h @@ -32,6 +32,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( DATA_BLOB db, size_t struct_size, int ndr_flags, + int flags, bool (*check_fn) (struct torture_context *, void *data)); _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( @@ -45,19 +46,24 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( #define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \ _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ - sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, (bool (*) (struct torture_context *, void *)) check_fn); + sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn); #define torture_suite_add_ndr_pull_fn_test(suite,name,data,flags,check_fn) \ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ - sizeof(struct name), flags, (bool (*) (struct torture_context *, void *)) check_fn); + sizeof(struct name), flags, 0, (bool (*) (struct torture_context *, void *)) check_fn); + +#define torture_suite_add_ndr_pull_fn_test_flags(suite,name,data,flags,flags2,check_fn) \ + _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \ + (ndr_pull_flags_fn_t)ndr_pull_ ## name, NULL, data_blob_const(data, sizeof(data)), \ + sizeof(struct name), flags, flags2, (bool (*) (struct torture_context *, void *)) check_fn); #define torture_suite_add_ndr_pullpush_test(suite,name,data_blob,check_fn) \ _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ data_blob, \ - sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, (bool (*) (struct torture_context *, void *)) check_fn); + sizeof(struct name), NDR_SCALARS|NDR_BUFFERS, 0, (bool (*) (struct torture_context *, void *)) check_fn); #define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \ _torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \ diff --git a/source4/torture/ndr/spoolss.c b/source4/torture/ndr/spoolss.c index 0cb792a..437677b 100644 --- a/source4/torture/ndr/spoolss.c +++ b/source4/torture/ndr/spoolss.c @@ -1602,6 +1602,32 @@ static bool getprinterdriver2_out_check(struct torture_context *tctx, return true; } +static const uint8_t openprinterex_64_req_data[] = { + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x5c, 0x00, + 0x31, 0x00, 0x39, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x36, 0x00, + 0x38, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x35, 0x00, + 0x5c, 0x00, 0x68, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x23, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x42, 0x00, + 0x41, 0x00, 0x5c, 0x00, 0x41, 0x00, 0x64, 0x00, 0x6d, 0x00, 0x69, 0x00, + 0x6e, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x00, 0x00 +}; + struct torture_suite *ndr_spoolss_suite(TALLOC_CTX *ctx) { struct torture_suite *suite = torture_suite_create(ctx, "spoolss"); @@ -1657,5 +1683,7 @@ struct torture_suite *ndr_spoolss_suite(TALLOC_CTX *ctx) torture_suite_add_ndr_pull_fn_test(suite, spoolss_GetPrinterDriver2, getprinterdriver2_in_data, NDR_IN, getprinterdriver2_in_check); torture_suite_add_ndr_pull_io_test(suite, spoolss_GetPrinterDriver2, getprinterdriver2_in_data, getprinterdriver2_out_data, getprinterdriver2_out_check); + torture_suite_add_ndr_pull_fn_test_flags(suite, spoolss_OpenPrinterEx, openprinterex_64_req_data, NDR_IN, LIBNDR_FLAG_NDR64, NULL); + return suite; } diff --git a/source4/torture/rpc/samba3rpc.c b/source4/torture/rpc/samba3rpc.c index c19476d..f7c7674 100644 --- a/source4/torture/rpc/samba3rpc.c +++ b/source4/torture/rpc/samba3rpc.c @@ -2804,8 +2804,8 @@ static bool torture_samba3_rpc_spoolss(struct torture_context *torture) servername); r.in.datatype = NULL; r.in.access_mask = 0; - r.in.level = 1; - r.in.userlevel.level1 = &userlevel1; + r.in.userlevel_ctr.level = 1; + r.in.userlevel_ctr.user_info.level1 = &userlevel1; r.out.handle = &server_handle; torture_assert_ntstatus_ok(torture, @@ -2836,8 +2836,8 @@ static bool torture_samba3_rpc_spoolss(struct torture_context *torture) torture, "\\\\%s\\%s", servername, printers[0]); r.in.datatype = NULL; r.in.access_mask = 0; - r.in.level = 1; - r.in.userlevel.level1 = &userlevel1; + r.in.userlevel_ctr.level = 1; + r.in.userlevel_ctr.user_info.level1 = &userlevel1; r.out.handle = &printer_handle; torture_assert_ntstatus_ok(torture, diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index b1229ac..064d3b4 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -5777,8 +5777,8 @@ static bool test_OpenPrinter_badname(struct torture_context *tctx, opEx.in.datatype = NULL; opEx.in.devmode_ctr.devmode = NULL; opEx.in.access_mask = 0; - opEx.in.level = 1; - opEx.in.userlevel.level1 = NULL; + opEx.in.userlevel_ctr.level = 1; + opEx.in.userlevel_ctr.user_info.level1 = NULL; opEx.out.handle = &handle; torture_comment(tctx, "Testing OpenPrinterEx(%s) with bad name\n", opEx.in.printername); @@ -5887,8 +5887,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx, const char *datatype, struct spoolss_DeviceMode *devmode, uint32_t access_mask, - uint32_t level, - union spoolss_UserLevel *userlevel, + struct spoolss_UserLevelCtr *userlevel_ctr, struct policy_handle *handle, WERROR expected_result) { @@ -5898,8 +5897,7 @@ static bool test_OpenPrinterEx(struct torture_context *tctx, r.in.datatype = datatype; r.in.devmode_ctr.devmode= devmode; r.in.access_mask = access_mask; - r.in.level = level; - r.in.userlevel = *userlevel; + r.in.userlevel_ctr = *userlevel_ctr; r.out.handle = handle; torture_comment(tctx, "Testing OpenPrinterEx(%s)\n", r.in.printername); @@ -5920,7 +5918,7 @@ static bool call_OpenPrinterEx(struct torture_context *tctx, struct spoolss_DeviceMode *devmode, struct policy_handle *handle) { - union spoolss_UserLevel userlevel; + struct spoolss_UserLevelCtr userlevel_ctr; struct spoolss_UserLevel1 userlevel1; struct dcerpc_binding_handle *b = p->binding_handle; @@ -5932,12 +5930,12 @@ static bool call_OpenPrinterEx(struct torture_context *tctx, userlevel1.minor = 3; userlevel1.processor = 4; - userlevel.level1 = &userlevel1; + userlevel_ctr.level = 1; + userlevel_ctr.user_info.level1 = &userlevel1; return test_OpenPrinterEx(tctx, b, name, NULL, devmode, SEC_FLAG_MAXIMUM_ALLOWED, - 1, - &userlevel, + &userlevel_ctr, handle, WERR_OK); } @@ -6041,7 +6039,7 @@ static bool test_openprinter(struct torture_context *tctx, struct dcerpc_binding_handle *b, const char *real_printername) { - union spoolss_UserLevel userlevel; + struct spoolss_UserLevelCtr userlevel_ctr; struct policy_handle handle; struct spoolss_UserLevel1 userlevel1; const char *printername = NULL; @@ -6119,13 +6117,14 @@ static bool test_openprinter(struct torture_context *tctx, userlevel1.minor = 3; userlevel1.processor = 4; - userlevel.level1 = &userlevel1; + userlevel_ctr.level = 1; + userlevel_ctr.user_info.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, + test_OpenPrinterEx(tctx, b, real_printername, NULL, NULL, 0, + &userlevel_ctr, &handle, WERR_OK), "OpenPrinterEx failed"); test_ClosePrinter(tctx, b, &handle); @@ -6137,8 +6136,8 @@ static bool test_openprinter(struct torture_context *tctx, tests[i].suffix); torture_assert(tctx, - test_OpenPrinterEx(tctx, b, printername, NULL, NULL, 0, 1, - &userlevel, &handle, + test_OpenPrinterEx(tctx, b, printername, NULL, NULL, 0, + &userlevel_ctr, &handle, tests[i].expected_result), "OpenPrinterEx failed"); if (W_ERROR_IS_OK(tests[i].expected_result)) { @@ -7335,8 +7334,8 @@ static bool test_architecture_buffer(struct torture_context *tctx, r.in.datatype = NULL; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; - r.in.level = 1; - r.in.userlevel.level1 = &u1; + r.in.userlevel_ctr.level = 1; + r.in.userlevel_ctr.user_info.level1 = &u1; r.out.handle = &handle; torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_OpenPrinterEx_r(b, tctx, &r), ""); diff --git a/source4/torture/rpc/spoolss_access.c b/source4/torture/rpc/spoolss_access.c index a935cbd..411dac1 100644 --- a/source4/torture/rpc/spoolss_access.c +++ b/source4/torture/rpc/spoolss_access.c @@ -83,8 +83,8 @@ static bool test_openprinter_handle(struct torture_context *tctx, r.in.datatype = NULL; r.in.devmode_ctr.devmode= NULL; r.in.access_mask = access_mask; - r.in.level = 1; - r.in.userlevel.level1 = &level1; + r.in.userlevel_ctr.level = 1; + r.in.userlevel_ctr.user_info.level1 = &level1; r.out.handle = handle; torture_comment(tctx, "Testing OpenPrinterEx(%s) with access_mask 0x%08x (%s)\n", diff --git a/source4/torture/rpc/spoolss_win.c b/source4/torture/rpc/spoolss_win.c index 96c3a24..bda0f3a 100644 --- a/source4/torture/rpc/spoolss_win.c +++ b/source4/torture/rpc/spoolss_win.c @@ -54,8 +54,8 @@ static bool test_OpenPrinterEx(struct torture_context *tctx, op.in.datatype = NULL; op.in.devmode_ctr.devmode = NULL; op.in.access_mask = access_mask; - op.in.level = 1; - op.in.userlevel.level1 = &ul_1; + op.in.userlevel_ctr.level = 1; + op.in.userlevel_ctr.user_info.level1 = &ul_1; op.out.handle = handle; ul_1.size = 1234; @@ -95,8 +95,8 @@ static bool test_OpenPrinterAsAdmin(struct torture_context *tctx, op.in.datatype = NULL; op.in.devmode_ctr.devmode = NULL; op.in.access_mask = SERVER_ALL_ACCESS; - op.in.level = 1; - op.in.userlevel.level1 = &ul_1; + op.in.userlevel_ctr.level = 1; + op.in.userlevel_ctr.user_info.level1 = &ul_1; op.out.handle = &handle; cp.in.handle = &handle; -- Samba Shared Repository