The branch, master has been updated via 48adfb2 samr: add three new ACB flags to IDL. via 77d4c28 s3-spoolss: Fix _spoolss_EnumPrintProcDataTypes error handling via 93d7230 s4-smbtorture: rework spoolss_EnumPrintProcDataTypes test. via 2921888 s3-spoolss: Fix _spoolss_EnumPrintProcessors error handling via a335848 s4-smbtorture: rework test_EnumPrintProcessors to let it test more combinations. via 0e1588a s3-waf: add NDR_PERFCOUNT subsystem. from 7fbe700 s4-ildap: fixed a talloc_steal with references error
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 48adfb264f0a8772ac04fc51af1c39460c011acb Author: Günther Deschner <g...@samba.org> Date: Tue Sep 28 01:10:57 2010 +0200 samr: add three new ACB flags to IDL. Guenther commit 77d4c280323ffc9f5f5f17023c90d0a904e14126 Author: Günther Deschner <g...@samba.org> Date: Tue Sep 28 00:10:54 2010 +0200 s3-spoolss: Fix _spoolss_EnumPrintProcDataTypes error handling commit 93d7230d25427af2955a9209335f657b8a901860 Author: Günther Deschner <g...@samba.org> Date: Tue Sep 28 00:10:31 2010 +0200 s4-smbtorture: rework spoolss_EnumPrintProcDataTypes test. Guenther commit 2921888a0808efbe765e3f52a83a91c2e03a44a6 Author: Günther Deschner <g...@samba.org> Date: Tue Sep 28 00:10:17 2010 +0200 s3-spoolss: Fix _spoolss_EnumPrintProcessors error handling commit a335848a883d98247470b0beb1eed14afec802de Author: Günther Deschner <g...@samba.org> Date: Mon Sep 27 23:33:52 2010 +0200 s4-smbtorture: rework test_EnumPrintProcessors to let it test more combinations. Guenther commit 0e1588aa980069dd267b3b0207db453c6ab23023 Author: Günther Deschner <g...@samba.org> Date: Mon Sep 27 08:10:58 2010 +0200 s3-waf: add NDR_PERFCOUNT subsystem. Guenther ----------------------------------------------------------------------- Summary of changes: librpc/idl/samr.idl | 5 +- source3/librpc/wscript_build | 5 + source3/rpc_server/srv_spoolss_nt.c | 9 ++ source3/wscript_build | 5 +- source4/torture/rpc/spoolss.c | 153 ++++++++++++++++++++-------------- 5 files changed, 110 insertions(+), 67 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/idl/samr.idl b/librpc/idl/samr.idl index d977ddd..f54d626 100644 --- a/librpc/idl/samr.idl +++ b/librpc/idl/samr.idl @@ -44,7 +44,10 @@ import "misc.idl", "lsa.idl", "security.idl"; ACB_USE_DES_KEY_ONLY = 0x00008000, /* 1 = Use DES key only */ ACB_DONT_REQUIRE_PREAUTH = 0x00010000, /* 1 = Preauth not required */ ACB_PW_EXPIRED = 0x00020000, /* 1 = Password Expired */ - ACB_NO_AUTH_DATA_REQD = 0x00080000 /* 1 = No authorization data required */ + ACB_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x00040000, + ACB_NO_AUTH_DATA_REQD = 0x00080000, /* 1 = No authorization data required */ + ACB_PARTIAL_SECRETS_ACCOUNT = 0x00100000, + ACB_USE_AES_KEYS = 0x00200000 } samr_AcctFlags; /* SAM server specific access rights */ diff --git a/source3/librpc/wscript_build b/source3/librpc/wscript_build index dfeacf6..66713ef 100644 --- a/source3/librpc/wscript_build +++ b/source3/librpc/wscript_build @@ -30,6 +30,11 @@ bld.SAMBA_SUBSYSTEM('NDR_SECRETS', public_deps='LIBNDR' ) +bld.SAMBA_SUBSYSTEM('NDR_PERFCOUNT', + source='gen_ndr/ndr_perfcount.c', + public_deps='LIBNDR' + ) + bld.SAMBA_SUBSYSTEM('NDR_WBINT', source='gen_ndr/ndr_wbint.c', public_deps='LIBNDR' diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index acb0513..89a835f 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -8501,6 +8501,10 @@ WERROR _spoolss_EnumPrintProcessors(struct pipes_struct *p, *r->out.needed = 0; *r->out.info = NULL; + if (!get_short_archi(r->in.environment)) { + return WERR_INVALID_ENVIRONMENT; + } + switch (r->in.level) { case 1: result = enumprintprocessors_level_1(p->mem_ctx, r->out.info, @@ -8592,6 +8596,11 @@ WERROR _spoolss_EnumPrintProcDataTypes(struct pipes_struct *p, *r->out.needed = 0; *r->out.info = NULL; + if (r->in.print_processor_name == NULL || + !strequal(r->in.print_processor_name, "winprint")) { + return WERR_UNKNOWN_PRINTPROCESSOR; + } + switch (r->in.level) { case 1: result = enumprintprocdatatypes_level_1(p->mem_ctx, r->out.info, diff --git a/source3/wscript_build b/source3/wscript_build index e42e84b..c44485f 100644 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -386,8 +386,7 @@ REG_FULL_SRC = '''${REG_SMBCONF_SRC} ${REG_BACKENDS_EXTRA_SRC} ${REG_INIT_FULL_SRC} registry/reg_eventlog.c - registry/reg_perfcount.c - librpc/gen_ndr/ndr_perfcount.c''' + registry/reg_perfcount.c''' SERVICES_SRC = '''services/svc_spoolss.c services/svc_rcinit.c @@ -1213,7 +1212,7 @@ bld.SAMBA_SUBSYSTEM('SMBD_BASE', PARAM_WITHOUT_REG LIBS LIBSMB POPT_SAMBA KRBCLIENT AVAHI LIBMSRPC_GEN LIBMSRPC LIBADS LIBADS_SERVER LIBADS_PRINTER VFS RPC_MODULES AUTH LOCKING LIBAFS LIBAFS_SETTOKEN PROFILE LIBNET LIBEVENTLOG - REGFIO REG_API_REGF PRINTING PRINTBACKEND SERVICES NDR_XATTR''', + REGFIO REG_API_REGF PRINTING PRINTBACKEND SERVICES NDR_XATTR NDR_PERFCOUNT''', vars=locals()) bld.SAMBA_SUBSYSTEM('RPC_MODULES', diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index c1079af..b577815 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -820,7 +820,8 @@ static bool test_EnumPrintProcessors_level(struct torture_context *tctx, const char *environment, uint32_t level, uint32_t *count_p, - union spoolss_PrintProcessorInfo **info_p) + union spoolss_PrintProcessorInfo **info_p, + WERROR expected_result) { struct spoolss_EnumPrintProcessors r; DATA_BLOB blob; @@ -837,7 +838,8 @@ static bool test_EnumPrintProcessors_level(struct torture_context *tctx, r.out.count = &count; r.out.info = &info; - torture_comment(tctx, "Testing EnumPrintProcessors level %u\n", r.in.level); + torture_comment(tctx, "Testing EnumPrintProcessors(%s) level %u\n", + r.in.environment, r.in.level); torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrintProcessors_r(b, tctx, &r), @@ -850,7 +852,7 @@ static bool test_EnumPrintProcessors_level(struct torture_context *tctx, dcerpc_spoolss_EnumPrintProcessors_r(b, tctx, &r), "EnumPrintProcessors failed"); } - torture_assert_werr_ok(tctx, r.out.result, + torture_assert_werr_equal(tctx, r.out.result, expected_result, "EnumPrintProcessors failed"); CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcessors, info, level, count, needed, 4); @@ -871,44 +873,76 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx, struct test_spoolss_context *ctx = talloc_get_type_abort(private_data, struct test_spoolss_context); - uint16_t levels[] = { 1 }; - int i, j; + uint16_t levels[] = {0, 1, 2, 3, 32, 256 }; + uint16_t ok[] = {0, 1, 0, 0, 0, 0 }; + int i; struct dcerpc_pipe *p = ctx->spoolss_pipe; struct dcerpc_binding_handle *b = p->binding_handle; + torture_assert(tctx, + test_EnumPrintProcessors_level(tctx, b, "phantasy", 1, NULL, NULL, WERR_INVALID_ENVIRONMENT), + "test_EnumPrintProcessors_level failed"); + for (i=0;i<ARRAY_SIZE(levels);i++) { - int level = levels[i]; union spoolss_PrintProcessorInfo *info; uint32_t count; + WERROR expected_result = ok[i] ? WERR_OK : WERR_INVALID_LEVEL; torture_assert(tctx, - test_EnumPrintProcessors_level(tctx, b, ctx->environment, level, &count, &info), + test_EnumPrintProcessors_level(tctx, b, ctx->environment, levels[i], &count, &info, expected_result), "test_EnumPrintProcessors_level failed"); - - ctx->print_processor_count[level] = count; - ctx->print_processors[level] = info; } - for (i=1;i<ARRAY_SIZE(levels);i++) { - int level = levels[i]; - int old_level = levels[i-1]; - torture_assert_int_equal(tctx, ctx->print_processor_count[level], ctx->print_processor_count[old_level], - "EnumPrintProcessors failed"); + return true; +} + +static bool test_EnumPrintProcDataTypes_level(struct torture_context *tctx, + struct dcerpc_binding_handle *b, + const char *print_processor_name, + uint32_t level, + uint32_t *count_p, + union spoolss_PrintProcDataTypesInfo **info_p, + WERROR expected_result) +{ + struct spoolss_EnumPrintProcDataTypes r; + DATA_BLOB blob; + uint32_t needed; + uint32_t count; + union spoolss_PrintProcDataTypesInfo *info; + + r.in.servername = ""; + r.in.print_processor_name = print_processor_name; + r.in.level = level; + r.in.buffer = NULL; + r.in.offered = 0; + r.out.needed = &needed; + r.out.count = &count; + r.out.info = &info; + + torture_comment(tctx, "Testing EnumPrintProcDataTypes(%s) level %u\n", + r.in.print_processor_name, r.in.level); + + torture_assert_ntstatus_ok(tctx, + dcerpc_spoolss_EnumPrintProcDataTypes_r(b, tctx, &r), + "EnumPrintProcDataTypes failed"); + if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) { + blob = data_blob_talloc_zero(tctx, needed); + r.in.buffer = &blob; + r.in.offered = needed; + torture_assert_ntstatus_ok(tctx, + dcerpc_spoolss_EnumPrintProcDataTypes_r(b, tctx, &r), + "EnumPrintProcDataTypes failed"); } + torture_assert_werr_equal(tctx, r.out.result, expected_result, + "EnumPrintProcDataTypes failed"); - for (i=0;i<ARRAY_SIZE(levels);i++) { - int level = levels[i]; - for (j=0;j<ctx->print_processor_count[level];j++) { -#if 0 - union spoolss_PrintProcessorInfo *cur = &ctx->print_processors[level][j]; - union spoolss_PrintProcessorInfo *ref = &ctx->print_processors[1][j]; -#endif - switch (level) { - case 1: - /* level 1 is our reference, and it makes no sense to compare it to itself */ - break; - } - } + CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcDataTypes, info, level, count, needed, 4); + + if (count_p) { + *count_p = count; + } + if (info_p) { + *info_p = info; } return true; @@ -920,57 +954,50 @@ static bool test_EnumPrintProcDataTypes(struct torture_context *tctx, struct test_spoolss_context *ctx = talloc_get_type_abort(private_data, struct test_spoolss_context); - NTSTATUS status; - struct spoolss_EnumPrintProcDataTypes r; - uint16_t levels[] = { 1 }; + uint16_t levels[] = {0, 1, 2, 3, 32, 256 }; + uint16_t ok[] = {0, 1, 0, 0, 0, 0 }; int i; struct dcerpc_pipe *p = ctx->spoolss_pipe; struct dcerpc_binding_handle *b = p->binding_handle; + torture_assert(tctx, + test_EnumPrintProcDataTypes_level(tctx, b, NULL, 1, NULL, NULL, WERR_UNKNOWN_PRINTPROCESSOR), + "test_EnumPrintProcDataTypes_level failed"); + + torture_assert(tctx, + test_EnumPrintProcDataTypes_level(tctx, b, "nonexisting", 1, NULL, NULL, WERR_UNKNOWN_PRINTPROCESSOR), + "test_EnumPrintProcDataTypes_level failed"); + for (i=0;i<ARRAY_SIZE(levels);i++) { int level = levels[i]; - DATA_BLOB blob; - uint32_t needed; uint32_t count; union spoolss_PrintProcDataTypesInfo *info; + WERROR expected_result = ok[i] ? WERR_OK : WERR_INVALID_LEVEL; - r.in.servername = ""; - r.in.print_processor_name = "winprint"; - r.in.level = level; - r.in.buffer = NULL; - r.in.offered = 0; - r.out.needed = &needed; - r.out.count = &count; - r.out.info = &info; - - torture_comment(tctx, "Testing EnumPrintProcDataTypes level %u\n", r.in.level); - - status = dcerpc_spoolss_EnumPrintProcDataTypes_r(b, tctx, &r); - torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcDataType failed"); - if (W_ERROR_IS_OK(r.out.result)) { - /* TODO: do some more checks here */ - continue; - } - torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER, - "EnumPrintProcDataTypes unexpected return code"); - - blob = data_blob_talloc_zero(tctx, needed); - r.in.buffer = &blob; - r.in.offered = needed; - - status = dcerpc_spoolss_EnumPrintProcDataTypes_r(b, tctx, &r); - torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrintProcDataTypes failed"); + torture_assert(tctx, + test_EnumPrintProcDataTypes_level(tctx, b, "winprint", level, &count, &info, expected_result), + "test_EnumPrintProcDataTypes_level failed"); + } - torture_assert_werr_ok(tctx, r.out.result, "EnumPrintProcDataTypes failed"); + { + union spoolss_PrintProcessorInfo *info; + uint32_t count; - CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrintProcDataTypes, info, r.in.level, count, needed, 4); + torture_assert(tctx, + test_EnumPrintProcessors_level(tctx, b, ctx->environment, 1, &count, &info, WERR_OK), + "test_EnumPrintProcessors_level failed"); + for (i=0; i < count; i++) { + torture_assert(tctx, + test_EnumPrintProcDataTypes_level(tctx, b, info[i].info1.print_processor_name, 1, NULL, NULL, WERR_OK), + "test_EnumPrintProcDataTypes_level failed"); + } } + return true; } - static bool test_EnumPrinters(struct torture_context *tctx, void *private_data) { @@ -4424,7 +4451,7 @@ static bool test_PrintProcessors(struct torture_context *tctx, torture_comment(tctx, "Testing Print Processor Info and winreg consistency\n"); torture_assert(tctx, - test_EnumPrintProcessors_level(tctx, b, environment, 1, &count, &info), + test_EnumPrintProcessors_level(tctx, b, environment, 1, &count, &info, WERR_OK), "failed to enum print processors level 1"); for (i=0; i < count; i++) { -- Samba Shared Repository