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