The branch, master has been updated
       via  b85b93dcff89e18bd15d4cef8b8c2dc61bc42cbe (commit)
       via  e7d72b585a09f6b43df0f38ff20c74050069fb60 (commit)
       via  66780e016b13db8b88eb209f568aedac6e6cf740 (commit)
      from  9aff7b0b5934badcfe31296bc599f9d040f67811 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b85b93dcff89e18bd15d4cef8b8c2dc61bc42cbe
Author: Günther Deschner <[email protected]>
Date:   Tue Jun 30 13:12:01 2009 +0200

    s3-spoolss: Bug #6512. Fix support for enumerating user forms.
    
    Found while testing Xerox WorkCentre 133 PCL driver, now also tested with
    torture test.
    
    Guenther

commit e7d72b585a09f6b43df0f38ff20c74050069fb60
Author: Günther Deschner <[email protected]>
Date:   Tue Jun 30 13:11:16 2009 +0200

    s4-smbtorture: Test for newly added form with enum call in RPC-SPOOLSS.
    
    Guenther

commit 66780e016b13db8b88eb209f568aedac6e6cf740
Author: Günther Deschner <[email protected]>
Date:   Tue Jun 30 11:38:41 2009 +0200

    s4-smbtorture: remove trailing whitespace from RPC-SPOOLSS.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/rpc_server/srv_spoolss_nt.c |   10 +-
 source4/torture/rpc/spoolss.c       |  241 +++++++++++++++++++++--------------
 2 files changed, 148 insertions(+), 103 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 899fed2..1ea92b4 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -7087,7 +7087,7 @@ static WERROR spoolss_enumforms_level1(TALLOC_CTX 
*mem_ctx,
 
        /* construct the list of form structures */
        for (i=0; i<num_builtin_forms; i++) {
-               DEBUGADD(6,("Filling form number [%d]\n",i));
+               DEBUGADD(6,("Filling builtin form number [%d]\n",i));
                result = fill_form_info_1(info, &info[i].info1,
                                          &builtin_forms[i]);
                if (!W_ERROR_IS_OK(result)) {
@@ -7095,10 +7095,10 @@ static WERROR spoolss_enumforms_level1(TALLOC_CTX 
*mem_ctx,
                }
        }
 
-       for (; i<num_user_forms; i++) {
-               DEBUGADD(6,("Filling form number [%d]\n",i));
-               result = fill_form_info_1(info, &info[i].info1,
-                                         &user_forms[i-num_builtin_forms]);
+       for (i=0; i<num_user_forms; i++) {
+               DEBUGADD(6,("Filling user form number [%d]\n",i));
+               result = fill_form_info_1(info, 
&info[i+num_builtin_forms].info1,
+                                         &user_forms[i]);
                if (!W_ERROR_IS_OK(result)) {
                        goto out;
                }
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 4640494..1c4b8ed 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -1,21 +1,22 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    test suite for spoolss rpc operations
 
    Copyright (C) Tim Potter 2003
    Copyright (C) Stefan Metzmacher 2005
    Copyright (C) Jelmer Vernooij 2007
-   
+   Copyright (C) Guenther Deschner 2009
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -89,13 +90,13 @@ static bool test_OpenPrinter_server(struct torture_context 
*tctx, struct dcerpc_
 
        status = dcerpc_spoolss_OpenPrinter(p, ctx, &op);
        torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_OpenPrinter 
failed");
-       torture_assert_werr_ok(tctx, op.out.result, "dcerpc_spoolss_OpenPrinter 
failed"); 
+       torture_assert_werr_ok(tctx, op.out.result, "dcerpc_spoolss_OpenPrinter 
failed");
 
        return true;
 }
 
-static bool test_EnumPorts(struct torture_context *tctx, 
-                          struct dcerpc_pipe *p, 
+static bool test_EnumPorts(struct torture_context *tctx,
+                          struct dcerpc_pipe *p,
                           struct test_spoolss_context *ctx)
 {
        NTSTATUS status;
@@ -126,7 +127,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
                        /* TODO: do some more checks here */
                        continue;
                }
-               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER, 
+               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER,
                        "EnumPorts unexpected return code");
 
                blob = data_blob_talloc(ctx, NULL, needed);
@@ -148,7 +149,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
        for (i=1;i<ARRAY_SIZE(levels);i++) {
                int level = levels[i];
                int old_level = levels[i-1];
-               torture_assert_int_equal(tctx, ctx->port_count[level], 
ctx->port_count[old_level], 
+               torture_assert_int_equal(tctx, ctx->port_count[level], 
ctx->port_count[old_level],
                        "EnumPorts invalid value");
        }
        /* if the array sizes are not the same we would maybe segfault in the 
following code */
@@ -235,8 +236,8 @@ static bool test_GetPrintProcessorDirectory(struct 
torture_context *tctx,
 }
 
 
-static bool test_GetPrinterDriverDirectory(struct torture_context *tctx, 
-                                          struct dcerpc_pipe *p, 
+static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
+                                          struct dcerpc_pipe *p,
                                           struct test_spoolss_context *ctx)
 {
        NTSTATUS status;
@@ -278,9 +279,9 @@ static bool test_GetPrinterDriverDirectory(struct 
torture_context *tctx,
                torture_comment(tctx, "Testing GetPrinterDriverDirectory level 
%u\n", r.in.level);
 
                status = dcerpc_spoolss_GetPrinterDriverDirectory(p, ctx, &r);
-               torture_assert_ntstatus_ok(tctx, status, 
+               torture_assert_ntstatus_ok(tctx, status,
                        "dcerpc_spoolss_GetPrinterDriverDirectory failed");
-               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER, 
+               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER,
                        "GetPrinterDriverDirectory unexpected return code");
 
                blob = data_blob_talloc(ctx, NULL, needed);
@@ -297,7 +298,7 @@ static bool test_GetPrinterDriverDirectory(struct 
torture_context *tctx,
        return true;
 }
 
-static bool test_EnumPrinterDrivers(struct torture_context *tctx, 
+static bool test_EnumPrinterDrivers(struct torture_context *tctx,
                                    struct dcerpc_pipe *p,
                                    struct test_spoolss_context *ctx)
 {
@@ -334,7 +335,7 @@ static bool test_EnumPrinterDrivers(struct torture_context 
*tctx,
                torture_comment(tctx, "Testing EnumPrinterDrivers level %u 
(%s)\n", r.in.level, r.in.environment);
 
                status = dcerpc_spoolss_EnumPrinterDrivers(p, ctx, &r);
-               torture_assert_ntstatus_ok(tctx, status, 
+               torture_assert_ntstatus_ok(tctx, status,
                                           "dcerpc_spoolss_EnumPrinterDrivers 
failed");
                if (W_ERROR_IS_OK(r.out.result)) {
                        /* TODO: do some more checks here */
@@ -444,8 +445,8 @@ static bool test_EnumPrinterDrivers(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_EnumMonitors(struct torture_context *tctx, 
-                             struct dcerpc_pipe *p, 
+static bool test_EnumMonitors(struct torture_context *tctx,
+                             struct dcerpc_pipe *p,
                              struct test_spoolss_context *ctx)
 {
        NTSTATUS status;
@@ -476,7 +477,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
                        /* TODO: do some more checks here */
                        continue;
                }
-               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER, 
+               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER,
                        "EnumMonitors failed");
 
                blob = data_blob_talloc(ctx, NULL, needed);
@@ -496,7 +497,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
        for (i=1;i<ARRAY_SIZE(levels);i++) {
                int level = levels[i];
                int old_level = levels[i-1];
-               torture_assert_int_equal(tctx, ctx->monitor_count[level], 
ctx->monitor_count[old_level], 
+               torture_assert_int_equal(tctx, ctx->monitor_count[level], 
ctx->monitor_count[old_level],
                                         "EnumMonitors invalid value");
        }
 
@@ -519,7 +520,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
        return true;
 }
 
-static bool test_EnumPrintProcessors(struct torture_context *tctx, 
+static bool test_EnumPrintProcessors(struct torture_context *tctx,
                                     struct dcerpc_pipe *p,
                                     struct test_spoolss_context *ctx)
 {
@@ -552,7 +553,7 @@ static bool test_EnumPrintProcessors(struct torture_context 
*tctx,
                        /* TODO: do some more checks here */
                        continue;
                }
-               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER, 
+               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER,
                        "EnumPrintProcessors unexpected return code");
 
                blob = data_blob_talloc(ctx, NULL, needed);
@@ -645,7 +646,7 @@ static bool test_EnumPrintProcDataTypes(struct 
torture_context *tctx,
 }
 
 
-static bool test_EnumPrinters(struct torture_context *tctx, 
+static bool test_EnumPrinters(struct torture_context *tctx,
                              struct dcerpc_pipe *p,
                              struct test_spoolss_context *ctx)
 {
@@ -678,7 +679,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
                        /* TODO: do some more checks here */
                        continue;
                }
-               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER, 
+               torture_assert_werr_equal(tctx, r.out.result, 
WERR_INSUFFICIENT_BUFFER,
                        "EnumPrinters unexpected return code");
 
                blob = data_blob_talloc(ctx, NULL, needed);
@@ -714,7 +715,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
                                COMPARE_UINT32(tctx, cur->info0, ref->info2, 
cjobs);
                                /*COMPARE_UINT32(tctx, cur->info0, ref->info2, 
total_jobs);
                                COMPARE_UINT32(tctx, cur->info0, ref->info2, 
total_bytes);
-                               COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, 
spoolss_Time time);                
+                               COMPARE_SPOOLSS_TIME(cur->info0, ref->info2, 
spoolss_Time time);
                                COMPARE_UINT32(tctx, cur->info0, ref->info2, 
global_counter);
                                COMPARE_UINT32(tctx, cur->info0, ref->info2, 
total_pages);
                                COMPARE_UINT32(tctx, cur->info0, ref->info2, 
version);
@@ -771,8 +772,8 @@ static bool test_EnumPrinters(struct torture_context *tctx,
        return true;
 }
 
-static bool test_GetPrinter(struct torture_context *tctx, 
-                           struct dcerpc_pipe *p, 
+static bool test_GetPrinter(struct torture_context *tctx,
+                           struct dcerpc_pipe *p,
                     struct policy_handle *handle)
 {
        NTSTATUS status;
@@ -780,7 +781,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
        uint16_t levels[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
        int i;
        uint32_t needed;
-       
+
        for (i=0;i<ARRAY_SIZE(levels);i++) {
                r.in.handle = handle;
                r.in.level = levels[i];
@@ -792,7 +793,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
 
                status = dcerpc_spoolss_GetPrinter(p, tctx, &r);
                torture_assert_ntstatus_ok(tctx, status, "GetPrinter failed");
-               
+
                if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
                        DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
                        data_blob_clear(&blob);
@@ -800,7 +801,7 @@ static bool test_GetPrinter(struct torture_context *tctx,
                        r.in.offered = needed;
                        status = dcerpc_spoolss_GetPrinter(p, tctx, &r);
                }
-               
+
                torture_assert_ntstatus_ok(tctx, status, "GetPrinter failed");
 
                torture_assert_werr_ok(tctx, r.out.result, "GetPrinter failed");
@@ -810,8 +811,8 @@ static bool test_GetPrinter(struct torture_context *tctx,
 }
 
 
-static bool test_ClosePrinter(struct torture_context *tctx, 
-                             struct dcerpc_pipe *p, 
+static bool test_ClosePrinter(struct torture_context *tctx,
+                             struct dcerpc_pipe *p,
                              struct policy_handle *handle)
 {
        NTSTATUS status;
@@ -828,9 +829,9 @@ static bool test_ClosePrinter(struct torture_context *tctx,
        return true;
 }
 
-static bool test_GetForm(struct torture_context *tctx, 
-                        struct dcerpc_pipe *p, 
-                        struct policy_handle *handle, 
+static bool test_GetForm(struct torture_context *tctx,
+                        struct dcerpc_pipe *p,
+                        struct policy_handle *handle,
                         const char *form_name,
                         uint32_t level)
 {
@@ -868,8 +869,8 @@ static bool test_GetForm(struct torture_context *tctx,
        return true;
 }
 
-static bool test_EnumForms(struct torture_context *tctx, 
-                          struct dcerpc_pipe *p, 
+static bool test_EnumForms(struct torture_context *tctx,
+                          struct dcerpc_pipe *p,
                           struct policy_handle *handle, bool print_server)
 {
        NTSTATUS status;
@@ -929,9 +930,9 @@ static bool test_EnumForms(struct torture_context *tctx,
        return true;
 }
 
-static bool test_DeleteForm(struct torture_context *tctx, 
-                           struct dcerpc_pipe *p, 
-                           struct policy_handle *handle, 
+static bool test_DeleteForm(struct torture_context *tctx,
+                           struct dcerpc_pipe *p,
+                           struct policy_handle *handle,
                            const char *form_name)
 {
        NTSTATUS status;
@@ -949,8 +950,8 @@ static bool test_DeleteForm(struct torture_context *tctx,
        return true;
 }
 
-static bool test_AddForm(struct torture_context *tctx, 
-                        struct dcerpc_pipe *p, 
+static bool test_AddForm(struct torture_context *tctx,
+                        struct dcerpc_pipe *p,
                         struct policy_handle *handle, bool print_server)
 {
        struct spoolss_AddForm r;
@@ -1003,6 +1004,50 @@ static bool test_AddForm(struct torture_context *tctx,
 
        if (!print_server) ret &= test_GetForm(tctx, p, handle, form_name, 1);
 
+       {
+               struct spoolss_EnumForms e;
+               union spoolss_FormInfo *info;
+               uint32_t needed;
+               uint32_t count;
+               bool found = false;
+
+               e.in.handle = handle;
+               e.in.level = 1;
+               e.in.buffer = NULL;
+               e.in.offered = 0;
+               e.out.needed = &needed;
+               e.out.count = &count;
+               e.out.info = &info;
+
+               torture_comment(tctx, "Testing EnumForms level 1\n");
+
+               status = dcerpc_spoolss_EnumForms(p, tctx, &e);
+               torture_assert_ntstatus_ok(tctx, status, "EnumForms failed");
+
+               if (print_server && W_ERROR_EQUAL(e.out.result, WERR_BADFID))
+                       torture_fail(tctx, "EnumForms on the PrintServer isn't 
supported by test server (NT4)");
+
+               if (W_ERROR_EQUAL(e.out.result, WERR_INSUFFICIENT_BUFFER)) {
+                       int j;
+                       DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
+                       data_blob_clear(&blob);
+                       e.in.buffer = &blob;
+                       e.in.offered = needed;
+
+                       status = dcerpc_spoolss_EnumForms(p, tctx, &e);
+
+                       torture_assert(tctx, info, "No forms returned");
+
+                       for (j = 0; j < count; j++) {
+                               if (strequal(form_name, 
info[j].info1.form_name)) {
+                                       found = true;
+                                       break;
+                               }
+                       }
+               }
+               torture_assert(tctx, found, "Newly added form not found in enum 
call");
+       }
+
        if (!test_DeleteForm(tctx, p, handle, form_name)) {
                ret = false;
        }
@@ -1010,7 +1055,7 @@ static bool test_AddForm(struct torture_context *tctx,
        return ret;
 }
 
-static bool test_EnumPorts_old(struct torture_context *tctx, 
+static bool test_EnumPorts_old(struct torture_context *tctx,
                               struct dcerpc_pipe *p)
 {
        NTSTATUS status;
@@ -1019,7 +1064,7 @@ static bool test_EnumPorts_old(struct torture_context 
*tctx,
        uint32_t count;
        union spoolss_PortInfo *info;
 
-       r.in.servername = talloc_asprintf(tctx, "\\\\%s", 
+       r.in.servername = talloc_asprintf(tctx, "\\\\%s",
                                          dcerpc_server_name(p));
        r.in.level = 2;
        r.in.buffer = NULL;
@@ -1049,13 +1094,13 @@ static bool test_EnumPorts_old(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_AddPort(struct torture_context *tctx, 
+static bool test_AddPort(struct torture_context *tctx,
                         struct dcerpc_pipe *p)
 {
        NTSTATUS status;
        struct spoolss_AddPort r;
 
-       r.in.server_name = talloc_asprintf(tctx, "\\\\%s", 
+       r.in.server_name = talloc_asprintf(tctx, "\\\\%s",
                                           dcerpc_server_name(p));
        r.in.unknown = 0;
        r.in.monitor_name = "foo";
@@ -1080,8 +1125,8 @@ static bool test_AddPort(struct torture_context *tctx,
        return true;
 }
 
-static bool test_GetJob(struct torture_context *tctx, 
-                       struct dcerpc_pipe *p, 
+static bool test_GetJob(struct torture_context *tctx,
+                       struct dcerpc_pipe *p,
                        struct policy_handle *handle, uint32_t job_id)
 {
        NTSTATUS status;
@@ -1129,9 +1174,9 @@ static bool test_GetJob(struct torture_context *tctx,
        return true;
 }
 
-static bool test_SetJob(struct torture_context *tctx, 
-                       struct dcerpc_pipe *p, 
-                       struct policy_handle *handle, uint32_t job_id, 
+static bool test_SetJob(struct torture_context *tctx,
+                       struct dcerpc_pipe *p,
+                       struct policy_handle *handle, uint32_t job_id,
                        enum spoolss_JobControl command)
 {
        NTSTATUS status;
@@ -1210,8 +1255,8 @@ static bool test_AddJob(struct torture_context *tctx,
 }
 
 
-static bool test_EnumJobs(struct torture_context *tctx, 
-                         struct dcerpc_pipe *p, 
+static bool test_EnumJobs(struct torture_context *tctx,
+                         struct dcerpc_pipe *p,
                          struct policy_handle *handle)
 {
        NTSTATUS status;
@@ -1265,8 +1310,8 @@ static bool test_EnumJobs(struct torture_context *tctx,
        return true;
 }
 
-static bool test_DoPrintTest(struct torture_context *tctx, 
-                            struct dcerpc_pipe *p, 
+static bool test_DoPrintTest(struct torture_context *tctx,
+                            struct dcerpc_pipe *p,
                             struct policy_handle *handle)
 {
        bool ret = true;
@@ -1301,7 +1346,7 @@ static bool test_DoPrintTest(struct torture_context *tctx,
                sp.in.handle            = handle;
 
                status = dcerpc_spoolss_StartPagePrinter(p, tctx, &sp);
-               torture_assert_ntstatus_ok(tctx, status, 
+               torture_assert_ntstatus_ok(tctx, status,
                                           "dcerpc_spoolss_StartPagePrinter 
failed");
                torture_assert_werr_ok(tctx, sp.out.result, "StartPagePrinter 
failed");
 
@@ -1340,8 +1385,8 @@ static bool test_DoPrintTest(struct torture_context *tctx,
        return ret;
 }
 
-static bool test_PausePrinter(struct torture_context *tctx, 
-                             struct dcerpc_pipe *p, 
+static bool test_PausePrinter(struct torture_context *tctx,
+                             struct dcerpc_pipe *p,
                              struct policy_handle *handle)
 {
        NTSTATUS status;
@@ -1373,8 +1418,8 @@ static bool test_PausePrinter(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_ResumePrinter(struct torture_context *tctx, 
-                              struct dcerpc_pipe *p, 
+static bool test_ResumePrinter(struct torture_context *tctx,
+                              struct dcerpc_pipe *p,
                               struct policy_handle *handle)
 {
        NTSTATUS status;
@@ -1406,9 +1451,9 @@ static bool test_ResumePrinter(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_GetPrinterData(struct torture_context *tctx, 
-                               struct dcerpc_pipe *p, 
-                               struct policy_handle *handle, 
+static bool test_GetPrinterData(struct torture_context *tctx,
+                               struct dcerpc_pipe *p,
+                               struct policy_handle *handle,
                                const char *value_name)
 {
        NTSTATUS status;
@@ -1441,9 +1486,9 @@ static bool test_GetPrinterData(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_GetPrinterDataEx(struct torture_context *tctx, 
-                                 struct dcerpc_pipe *p, 
-                                 struct policy_handle *handle, 
+static bool test_GetPrinterDataEx(struct torture_context *tctx,
+                                 struct dcerpc_pipe *p,
+                                 struct policy_handle *handle,
                                  const char *key_name,
                                  const char *value_name)
 {
@@ -1484,7 +1529,7 @@ static bool test_GetPrinterDataEx(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_EnumPrinterData(struct torture_context *tctx, struct 
dcerpc_pipe *p, 
+static bool test_EnumPrinterData(struct torture_context *tctx, struct 
dcerpc_pipe *p,


-- 
Samba Shared Repository

Reply via email to