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

Reply via email to