From: Günther Deschner Date: Fri, 18 Jan 2013 21:22:13 +0000 (+0100) Subject: spoolss: make spoolss deal with ndr64 StartDocPrinter by using proper container object. X-Git-Tag: ldb-1.1.15~15 X-Git-Url: http://git.samba.org/samba.git/?a=commitdiff_plain;h=11fba102082239c5d70b6314b19dab72b49478ed;p=nivanova%2Fsamba-autobuild%2F.git spoolss: make spoolss deal with ndr64 StartDocPrinter by using proper container object. Guenther Signed-off-by: Günther Deschner Reviewed-by: Andreas Schneider --- diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index ba67188148b..69d9f8e792f 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -1753,10 +1753,14 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") [default]; } spoolss_DocumentInfo; + typedef struct { + uint32 level; + [switch_is(level)] spoolss_DocumentInfo info; + } spoolss_DocumentInfoCtr; + WERROR spoolss_StartDocPrinter( [in,ref] policy_handle *handle, - [in] uint32 level, - [in,switch_is(level)] spoolss_DocumentInfo info, + [in,ref] spoolss_DocumentInfoCtr *info_ctr, [out,ref] uint32 *job_id ); diff --git a/source3/printing/printspoolss.c b/source3/printing/printspoolss.c index 7a730a55bb0..acf4c0d19af 100644 --- a/source3/printing/printspoolss.c +++ b/source3/printing/printspoolss.c @@ -64,7 +64,8 @@ NTSTATUS print_spool_open(files_struct *fsp, struct print_file_data *pf; struct dcerpc_binding_handle *b = NULL; struct spoolss_DevmodeContainer devmode_ctr; - union spoolss_DocumentInfo info; + struct spoolss_DocumentInfoCtr info_ctr; + struct spoolss_DocumentInfo1 *info1; int fd = -1; WERROR werr; @@ -173,17 +174,23 @@ NTSTATUS print_spool_open(files_struct *fsp, goto done; } - info.info1 = talloc(tmp_ctx, struct spoolss_DocumentInfo1); - if (!info.info1) { + info1 = talloc(tmp_ctx, struct spoolss_DocumentInfo1); + if (info1 == NULL) { status = NT_STATUS_NO_MEMORY; goto done; } - info.info1->document_name = pf->docname; - info.info1->output_file = pf->filename; - info.info1->datatype = "RAW"; + info1->document_name = pf->docname; + info1->output_file = pf->filename; + info1->datatype = "RAW"; - status = dcerpc_spoolss_StartDocPrinter(b, tmp_ctx, &pf->handle, - 1, info, &pf->jobid, &werr); + info_ctr.level = 1; + info_ctr.info.info1 = info1; + + status = dcerpc_spoolss_StartDocPrinter(b, tmp_ctx, + &pf->handle, + &info_ctr, + &pf->jobid, + &werr); if (!NT_STATUS_IS_OK(status)) { goto done; } diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 9601ce6a62e..3107cda36fb 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -5730,11 +5730,11 @@ WERROR _spoolss_StartDocPrinter(struct pipes_struct *p, return WERR_INVALID_HANDLE; } - if (r->in.level != 1) { + if (r->in.info_ctr->level != 1) { return WERR_UNKNOWN_LEVEL; } - info_1 = r->in.info.info1; + info_1 = r->in.info_ctr->info.info1; /* * a nice thing with NT is it doesn't listen to what you tell it. diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index d13a11dc870..509c61fd7e5 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -3273,6 +3273,7 @@ static bool test_DoPrintTest_add_one_job(struct torture_context *tctx, { NTSTATUS status; struct spoolss_StartDocPrinter s; + struct spoolss_DocumentInfoCtr info_ctr; struct spoolss_DocumentInfo1 info1; struct spoolss_StartPagePrinter sp; struct spoolss_WritePrinter w; @@ -3284,13 +3285,16 @@ static bool test_DoPrintTest_add_one_job(struct torture_context *tctx, torture_comment(tctx, "Testing StartDocPrinter\n"); s.in.handle = handle; - s.in.level = 1; - s.in.info.info1 = &info1; + s.in.info_ctr = &info_ctr; s.out.job_id = job_id; + info1.document_name = document_name; info1.output_file = NULL; info1.datatype = "RAW"; + info_ctr.level = 1; + info_ctr.info.info1 = &info1; + status = dcerpc_spoolss_StartDocPrinter_r(b, tctx, &s); torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_StartDocPrinter failed"); torture_assert_werr_ok(tctx, s.out.result, "StartDocPrinter failed");