The branch, master has been updated
       via  8db3258 s3-spoolss: make it more obvious what 
winreg_create_printer() does.
       via  621fb88 s3-rpcclient: rename duplicate enumkey command to 
winreg_enumkey.
       via  be884c1 s3-spoolss: as smbtorture testing proves: devmode size is 
the size of the devicemode minus the driverdata extra size.
       via  1f3fb30 s4-smbtorture: make sure there is always driverextra data 
in spoolss devmode size tests.
       via  9b1878e s3-spoolss: disallow storing an invalid devmode size.
       via  aefbec5 s4-smbtorture: add tests for the size member of spoolss 
devicemodes.
       via  7a7b61e s4-smbtorture: prepare devicemode test for expected result 
tests.
       via  bb51c05 s4-smbtorture: add some paranoia checks for 0 sized 
devmodes.
      from  5780940 s3:vfs:shadow_copy2: fix indentation in 
_SHADOW2_NEXT_SMB_FNAME

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


- Log -----------------------------------------------------------------
commit 8db3258983bcf4ad73679a5bd5a554adc062a324
Author: Günther Deschner <g...@samba.org>
Date:   Fri Jan 21 10:38:23 2011 +0100

    s3-spoolss: make it more obvious what winreg_create_printer() does.
    
    Guenther
    
    Autobuild-User: Günther Deschner <g...@samba.org>
    Autobuild-Date: Fri Jan 21 11:43:29 CET 2011 on sn-devel-104

commit 621fb88e331bb247d1726e7ffcd2a3c4819e6e14
Author: Günther Deschner <g...@samba.org>
Date:   Fri Jan 21 10:34:38 2011 +0100

    s3-rpcclient: rename duplicate enumkey command to winreg_enumkey.
    
    Guenther

commit be884c1bfdfec24c067705af132a4d7dce807376
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 14:39:50 2011 +0100

    s3-spoolss: as smbtorture testing proves: devmode size is the size of the 
devicemode minus the driverdata extra size.
    
    Jeremy, please check.
    
    Guenther

commit 1f3fb30ed938d1ffdf4fbdcbc8b429becbbdb801
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 14:39:36 2011 +0100

    s4-smbtorture: make sure there is always driverextra data in spoolss 
devmode size tests.
    
    Guenther

commit 9b1878e538a39b5459a74790b371ef5c098e0642
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 13:49:51 2011 +0100

    s3-spoolss: disallow storing an invalid devmode size.
    
    Guenther

commit aefbec52703a10ebe49ddd4883ea728116825114
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 13:48:17 2011 +0100

    s4-smbtorture: add tests for the size member of spoolss devicemodes.
    
    Guenther

commit 7a7b61ef082070de9407c937a86e299a98a6ef58
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 13:44:46 2011 +0100

    s4-smbtorture: prepare devicemode test for expected result tests.
    
    Guenther

commit bb51c050149c2e2ea5bf81f283da862fc1e840d2
Author: Günther Deschner <g...@samba.org>
Date:   Wed Jan 19 00:15:09 2011 +0100

    s4-smbtorture: add some paranoia checks for 0 sized devmodes.
    
    Guenther

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

Summary of changes:
 source3/rpc_server/srv_spoolss_util.c |   14 +++++----
 source3/rpcclient/cmd_winreg.c        |    2 +-
 source4/torture/rpc/spoolss.c         |   53 ++++++++++++++++++++++++++------
 3 files changed, 52 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpc_server/srv_spoolss_util.c 
b/source3/rpc_server/srv_spoolss_util.c
index 89cdc2d..79549ac 100644
--- a/source3/rpc_server/srv_spoolss_util.c
+++ b/source3/rpc_server/srv_spoolss_util.c
@@ -1457,8 +1457,7 @@ WERROR winreg_create_printer(TALLOC_CTX *mem_ctx,
                        goto done;
                }
 
-               switch (i) {
-               case 1: {
+               if (strequal(subkeys[i], SPOOL_DSSPOOLER_KEY)) {
                        const char *dnssuffix;
                        const char *longname;
                        const char *uncname;
@@ -1565,9 +1564,6 @@ WERROR winreg_create_printer(TALLOC_CTX *mem_ctx,
                        if (!W_ERROR_IS_OK(result)) {
                                goto done;
                        }
-               } /* case 1 */
-               default:
-                       break;
                }
 
                if (is_valid_policy_hnd(&key_hnd)) {
@@ -1773,6 +1769,12 @@ WERROR winreg_update_printer(TALLOC_CTX *mem_ctx,
                                goto done;
                        }
                }
+
+               if (devmode->size != (ndr_size_spoolss_DeviceMode(devmode, 0) - 
devmode->__driverextra_length)) {
+                       result = WERR_INVALID_PARAM;
+                       goto done;
+               }
+
                ndr_err = ndr_push_struct_blob(&blob, tmp_ctx, devmode,
                                (ndr_push_flags_fn_t) 
ndr_push_spoolss_DeviceMode);
                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
@@ -2211,7 +2213,7 @@ WERROR winreg_get_printer(TALLOC_CTX *mem_ctx,
        }
 
        if (info2->devmode) {
-               info2->devmode->size = 
ndr_size_spoolss_DeviceMode(info2->devmode, 0);
+               info2->devmode->size = 
ndr_size_spoolss_DeviceMode(info2->devmode, 0) - 
info2->devmode->driverextra_data.length;
        }
 
        result = winreg_get_printer_secdesc(info2,
diff --git a/source3/rpcclient/cmd_winreg.c b/source3/rpcclient/cmd_winreg.c
index cf0df24..2ba2d6d 100644
--- a/source3/rpcclient/cmd_winreg.c
+++ b/source3/rpcclient/cmd_winreg.c
@@ -319,7 +319,7 @@ static WERROR cmd_winreg_querymultiplevalues2(struct 
rpc_pipe_client *cli,
 struct cmd_set winreg_commands[] = {
 
        { "WINREG" },
-       { "enumkey", RPC_RTYPE_WERROR, NULL, cmd_winreg_enumkeys, 
&ndr_table_winreg.syntax_id, NULL, "Enumerate Keys", "" },
+       { "winreg_enumkey", RPC_RTYPE_WERROR, NULL, cmd_winreg_enumkeys, 
&ndr_table_winreg.syntax_id, NULL, "Enumerate Keys", "" },
        { "querymultiplevalues", RPC_RTYPE_WERROR, NULL, 
cmd_winreg_querymultiplevalues, &ndr_table_winreg.syntax_id, NULL, "Query 
multiple values", "" },
        { "querymultiplevalues2", RPC_RTYPE_WERROR, NULL, 
cmd_winreg_querymultiplevalues2, &ndr_table_winreg.syntax_id, NULL, "Query 
multiple values", "" },
        { NULL }
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 2dd7164..dc9f704 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -5,7 +5,7 @@
    Copyright (C) Tim Potter 2003
    Copyright (C) Stefan Metzmacher 2005
    Copyright (C) Jelmer Vernooij 2007
-   Copyright (C) Guenther Deschner 2009-2010
+   Copyright (C) Guenther Deschner 2009-2011
 
    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
@@ -2135,7 +2135,7 @@ static bool test_devicemode_full(struct torture_context 
*tctx,
        bool ret = true;
        NTSTATUS status;
 
-#define TEST_DEVMODE_INT_EXP(lvl1, field1, lvl2, field2, value, exp_value) do 
{ \
+#define TEST_DEVMODE_INT_EXP_RESULT(lvl1, field1, lvl2, field2, value, 
exp_value, expected_result) do { \
                torture_comment(tctx, "field test %d/%s vs %d/%s\n", lvl1, 
#field1, lvl2, #field2); \
                q.in.level = lvl1; \
                TESTGETCALL(GetPrinter, q) \
@@ -2147,16 +2147,22 @@ static bool test_devicemode_full(struct torture_context 
*tctx,
                }\
                devmode_ctr.devmode = q.out.info->info ## lvl1.devmode; \
                devmode_ctr.devmode->field1 = value; \
-               TESTSETCALL(SetPrinter, s) \
-               TESTGETCALL(GetPrinter, q) \
-               INT_EQUAL(q.out.info->info ## lvl1.devmode->field1, exp_value, 
field1); \
-               q.in.level = lvl2; \
-               TESTGETCALL(GetPrinter, q) \
-               INT_EQUAL(q.out.info->info ## lvl2.devmode->field2, exp_value, 
field1); \
+               TESTSETCALL_EXP(SetPrinter, s, expected_result) \
+               if (W_ERROR_IS_OK(expected_result)) { \
+                       TESTGETCALL(GetPrinter, q) \
+                       INT_EQUAL(q.out.info->info ## lvl1.devmode->field1, 
exp_value, field1); \
+                       q.in.level = lvl2; \
+                       TESTGETCALL(GetPrinter, q) \
+                       INT_EQUAL(q.out.info->info ## lvl2.devmode->field2, 
exp_value, field1); \
+               }\
        } while (0)
 
+#define TEST_DEVMODE_INT_EXP(lvl1, field1, lvl2, field2, value, 
expected_result) do { \
+        TEST_DEVMODE_INT_EXP_RESULT(lvl1, field1, lvl2, field2, value, value, 
expected_result); \
+        } while (0)
+
 #define TEST_DEVMODE_INT(lvl1, field1, lvl2, field2, value) do { \
-        TEST_DEVMODE_INT_EXP(lvl1, field1, lvl2, field2, value, value); \
+        TEST_DEVMODE_INT_EXP_RESULT(lvl1, field1, lvl2, field2, value, value, 
WERR_OK); \
         } while (0)
 
        ZERO_STRUCT(devmode_ctr);
@@ -2177,10 +2183,22 @@ static bool test_devicemode_full(struct torture_context 
*tctx,
        const char *devicename;/* [charset(UTF16)] */
        enum spoolss_DeviceModeSpecVersion specversion;
        uint16_t driverversion;
-       uint16_t size;
        uint16_t __driverextra_length;/* [value(r->driverextra_data.length)] */
        uint32_t fields;
 #endif
+       TEST_DEVMODE_INT_EXP(8, size,           8, size, __LINE__, 
WERR_INVALID_PARAM);
+       TEST_DEVMODE_INT_EXP(8, size,           8, size, 0, WERR_INVALID_PARAM);
+       TEST_DEVMODE_INT_EXP(8, size,           8, size, 0xffff, 
WERR_INVALID_PARAM);
+       TEST_DEVMODE_INT_EXP(8, size,           8, size, 
ndr_size_spoolss_DeviceMode(devmode_ctr.devmode, 0), 
(devmode_ctr.devmode->__driverextra_length > 0 ) ? WERR_INVALID_PARAM : 
WERR_OK);
+       TEST_DEVMODE_INT(8, size,               8, size, 
ndr_size_spoolss_DeviceMode(devmode_ctr.devmode, 0) - 
devmode_ctr.devmode->__driverextra_length);
+
+       devmode_ctr.devmode->driverextra_data = 
data_blob_string_const("foobar");
+       torture_assert(tctx,
+               test_devmode_set_level(tctx, b, handle, 8, devmode_ctr.devmode),
+               "failed to set devmode");
+
+       TEST_DEVMODE_INT_EXP(8, size,           8, size, 
ndr_size_spoolss_DeviceMode(devmode_ctr.devmode, 0), 
(devmode_ctr.devmode->__driverextra_length > 0 ) ? WERR_INVALID_PARAM : 
WERR_OK);
+       TEST_DEVMODE_INT(8, size,               8, size, 
ndr_size_spoolss_DeviceMode(devmode_ctr.devmode, 0) - 
devmode_ctr.devmode->__driverextra_length);
 
        TEST_DEVMODE_INT(8, orientation,        8, orientation, __LINE__);
        TEST_DEVMODE_INT(8, papersize,          8, papersize, __LINE__);
@@ -2239,10 +2257,20 @@ static bool test_PrinterInfo_DevModes(struct 
torture_context *tctx,
 
        devmode = info.info8.devmode;
 
+       if (devmode && devmode->size == 0) {
+               torture_fail(tctx,
+                       "devmode of zero size!");
+       }
+
        torture_assert(tctx, test_GetPrinter_level(tctx, b, handle, 2, &info), 
"");
 
        devmode2 = info.info2.devmode;
 
+       if (devmode2 && devmode2->size == 0) {
+               torture_fail(tctx,
+                       "devmode of zero size!");
+       }
+
        torture_assert(tctx, test_devicemode_equal(tctx, devmode, devmode2),
                "DM level 8 != DM level 2");
 
@@ -2384,6 +2412,11 @@ static bool test_PrinterInfo_DevMode(struct 
torture_context *tctx,
 
        devmode = info.info8.devmode;
 
+       if (devmode && devmode->size == 0) {
+               torture_fail(tctx,
+                       "devmode of zero size!");
+       }
+
        if (addprinter_devmode) {
                if (!test_devicemode_equal(tctx, devmode, addprinter_devmode)) {
                        torture_warning(tctx, "current global DM is != DM 
provided in addprinter");


-- 
Samba Shared Repository

Reply via email to