[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha8-131-gb85b93d
Günther Deschner
gd at samba.org
Tue Jun 30 11:35:54 GMT 2009
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 <gd at samba.org>
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 <gd at samba.org>
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 <gd at samba.org>
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
More information about the samba-cvs
mailing list