[SCM] Samba Shared Repository - branch v3-6-test updated

Günther Deschner gd at samba.org
Fri Jan 21 03:47:15 MST 2011


The branch, v3-6-test has been updated
       via  404a403 s3-spoolss: make it more obvious what winreg_create_printer() does.
       via  f3bd75c s3-rpcclient: rename duplicate enumkey command to winreg_enumkey.
       via  620c09e s3-spoolss: as smbtorture testing proves: devmode size is the size of the devicemode minus the driverdata extra size.
       via  773830d s4-smbtorture: make sure there is always driverextra data in spoolss devmode size tests.
       via  d191c2e s3-spoolss: disallow storing an invalid devmode size.
       via  b9b2266 s4-smbtorture: add tests for the size member of spoolss devicemodes.
       via  611ff18 s4-smbtorture: prepare devicemode test for expected result tests.
       via  0524e24 s4-smbtorture: add some paranoia checks for 0 sized devmodes.
      from  f52c294 waf: change private libraries to use the same soname as public libraries

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 404a40350d8140f4d49b9fae83971fd5e9a8a587
Author: Günther Deschner <gd at 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 <gd at samba.org>
    Autobuild-Date: Fri Jan 21 11:43:29 CET 2011 on sn-devel-104
    (cherry picked from commit 8db3258983bcf4ad73679a5bd5a554adc062a324)

commit f3bd75c5b017a82c333f4902d0051420444c818b
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 21 10:34:38 2011 +0100

    s3-rpcclient: rename duplicate enumkey command to winreg_enumkey.
    
    Guenther
    (cherry picked from commit 621fb88e331bb247d1726e7ffcd2a3c4819e6e14)

commit 620c09edcbf22bb8e9145b106f27f20090146bf0
Author: Günther Deschner <gd at 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
    (cherry picked from commit be884c1bfdfec24c067705af132a4d7dce807376)

commit 773830d2da1b0199286c268a9a01d86b1e79ad94
Author: Günther Deschner <gd at 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
    (cherry picked from commit 1f3fb30ed938d1ffdf4fbdcbc8b429becbbdb801)

commit d191c2e3af202a37202f629c4f461eb751523ec6
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jan 19 13:49:51 2011 +0100

    s3-spoolss: disallow storing an invalid devmode size.
    
    Guenther
    (cherry picked from commit 9b1878e538a39b5459a74790b371ef5c098e0642)

commit b9b226680a941cff7a805158b9099ff754041e10
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jan 19 13:48:17 2011 +0100

    s4-smbtorture: add tests for the size member of spoolss devicemodes.
    
    Guenther
    (cherry picked from commit aefbec52703a10ebe49ddd4883ea728116825114)

commit 611ff18b7a1cedbdfd1baa9e3603f18314864718
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jan 19 13:44:46 2011 +0100

    s4-smbtorture: prepare devicemode test for expected result tests.
    
    Guenther
    (cherry picked from commit 7a7b61ef082070de9407c937a86e299a98a6ef58)

commit 0524e247610942acb0ee13ac8c5ec29f3107ed8c
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jan 19 00:15:09 2011 +0100

    s4-smbtorture: add some paranoia checks for 0 sized devmodes.
    
    Guenther
    (cherry picked from commit bb51c050149c2e2ea5bf81f283da862fc1e840d2)

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

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


More information about the samba-cvs mailing list