spoolss: make spoolss deal with ndr64 StartDocPrinter by using proper container object.
authorGünther Deschner <gd@samba.org>
Fri, 18 Jan 2013 21:22:13 +0000 (22:22 +0100)
committerAndreas Schneider <asn@samba.org>
Thu, 24 Jan 2013 16:42:25 +0000 (17:42 +0100)
Guenther

Signed-off-by: Günther Deschner <gd@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
librpc/idl/spoolss.idl
source3/printing/printspoolss.c
source3/rpc_server/spoolss/srv_spoolss_nt.c
source4/torture/rpc/spoolss.c

index ba67188148ba7f550b4fe24215161420bb8bc507..69d9f8e792f2b945b1a5e67d118b635c5bb18304 100644 (file)
@@ -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
        );
 
index 7a730a55bb0c407ffe94e364d27281cc656592f7..acf4c0d19afc26cb0fd16b8241cf6d537aac42b2 100644 (file)
@@ -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;
        }
index 9601ce6a62e70a8ccdc797ea06a5cafee6663284..3107cda36fbcdf65a7e561fe4477a6b86dee921b 100644 (file)
@@ -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.
index d13a11dc87053b54f405c8d895d27b7aaf8eb227..509c61fd7e5c221621e2d27e33592ca85daba4e7 100644 (file)
@@ -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");