[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Thu Apr 8 07:04:02 MDT 2010


The branch, master has been updated
       via  16deed7... s4-smbtorture: add PrinterInfo level 2 / winreg consistency test.
       via  f87a18e... s4-smbtorture: minor cleanup, use data_blob_talloc_zero() in RPC-SPOOLSS.
      from  f3f8249... s4:WAF buildsystem - support out of "source4" directory builds

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


- Log -----------------------------------------------------------------
commit 16deed7199b837f2d8982045edbdae4e3af13afa
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 8 15:00:34 2010 +0200

    s4-smbtorture: add PrinterInfo level 2 / winreg consistency test.
    
    This compares PrinterInfo2 with contents of
    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\printername and
    HKLM\SYSTEM\CurrentControlSet\Control\Print\Printers\printername
    
    Guenther

commit f87a18ec3b3217cf1ba1706fed49b4f77d6a9815
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 8 11:56:27 2010 +0200

    s4-smbtorture: minor cleanup, use data_blob_talloc_zero() in RPC-SPOOLSS.
    
    Guenther

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

Summary of changes:
 source4/torture/rpc/spoolss.c |  245 ++++++++++++++++++++++++++++++++++-------
 1 files changed, 205 insertions(+), 40 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index d46780b..9a647f7 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -42,6 +42,7 @@
 #define TOP_LEVEL_PRINT_PRINTERS_KEY TOP_LEVEL_PRINT_KEY "\\Printers"
 #define TOP_LEVEL_CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control\\Print"
 #define TOP_LEVEL_CONTROL_FORMS_KEY TOP_LEVEL_CONTROL_KEY "\\Forms"
+#define TOP_LEVEL_CONTROL_PRINTERS_KEY TOP_LEVEL_CONTROL_KEY "\\Printers"
 
 struct test_spoolss_context {
 	/* print server handle */
@@ -264,8 +265,7 @@ static bool test_EnumPorts(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPorts unexpected return code");
 
-		blob = data_blob_talloc(ctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(ctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -358,8 +358,7 @@ static bool test_GetPrintProcessorDirectory(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"GetPrintProcessorDirectory unexpected return code");
 
-		blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -424,8 +423,7 @@ static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"GetPrinterDriverDirectory unexpected return code");
 
-		blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -481,8 +479,7 @@ static bool test_EnumPrinterDrivers(struct torture_context *tctx,
 			continue;
 		}
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			blob = data_blob_talloc(ctx, NULL, needed);
-			data_blob_clear(&blob);
+			blob = data_blob_talloc_zero(ctx, needed);
 			r.in.buffer = &blob;
 			r.in.offered = needed;
 
@@ -625,8 +622,7 @@ static bool test_EnumMonitors(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumMonitors failed");
 
-		blob = data_blob_talloc(ctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(ctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -704,8 +700,7 @@ static bool test_EnumPrintProcessors(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPrintProcessors unexpected return code");
 
-		blob = data_blob_talloc(ctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(ctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -780,8 +775,7 @@ static bool test_EnumPrintProcDataTypes(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPrintProcDataTypes unexpected return code");
 
-		blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -834,8 +828,7 @@ static bool test_EnumPrinters(struct torture_context *tctx,
 		torture_assert_werr_equal(tctx, r.out.result, WERR_INSUFFICIENT_BUFFER,
 			"EnumPrinters unexpected return code");
 
-		blob = data_blob_talloc(ctx, NULL, needed);
-		data_blob_clear(&blob);
+		blob = data_blob_talloc_zero(ctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -953,8 +946,7 @@ bool test_GetPrinter_level(struct torture_context *tctx,
 		"GetPrinter failed");
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -1315,8 +1307,7 @@ static bool test_PrinterInfo(struct torture_context *tctx,
 			break; \
 		}\
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {\
-			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed); \
-			data_blob_clear(&blob); \
+			DATA_BLOB blob = data_blob_talloc_zero(tctx, needed); \
 			r.in.buffer = &blob; \
 			r.in.offered = needed; \
 		}\
@@ -2235,8 +2226,7 @@ static bool test_GetForm_args(struct torture_context *tctx,
 	torture_assert_ntstatus_ok(tctx, status, "GetForm failed");
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 		status = dcerpc_spoolss_GetForm_r(b, tctx, &r);
@@ -2303,8 +2293,7 @@ static bool test_EnumForms(struct torture_context *tctx,
 	}
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -2710,8 +2699,7 @@ static bool test_EnumPorts_old(struct torture_context *tctx,
 	torture_assert_ntstatus_ok(tctx, status, "EnumPorts failed");
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -2790,8 +2778,7 @@ static bool test_GetJob_args(struct torture_context *tctx,
 	}
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -2938,8 +2925,7 @@ static bool test_EnumJobs_args(struct torture_context *tctx,
 	torture_assert_ntstatus_ok(tctx, status, "EnumJobs failed");
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 
@@ -3857,6 +3843,159 @@ static bool test_GetForm_winreg(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_GetPrinterInfo_winreg(struct torture_context *tctx,
+				       struct dcerpc_binding_handle *b,
+				       struct policy_handle *handle,
+				       const char *printer_name,
+				       struct dcerpc_binding_handle *winreg_handle,
+				       struct policy_handle *hive_handle)
+{
+	union spoolss_PrinterInfo info;
+	const char *keys[] = {
+		TOP_LEVEL_CONTROL_PRINTERS_KEY,
+		TOP_LEVEL_PRINT_PRINTERS_KEY
+	};
+	int i;
+
+	torture_comment(tctx, "Testing Printer Info and winreg consistency\n");
+
+	torture_assert(tctx,
+		test_GetPrinter_level(tctx, b, handle, 2, &info),
+		"failed to get printer info level 2");
+
+#define test_sz(key, wname, iname) \
+do {\
+	DATA_BLOB blob;\
+	const char *str;\
+	enum winreg_Type w_type;\
+	uint32_t w_size;\
+	uint32_t w_length;\
+	uint8_t *w_data;\
+	torture_assert(tctx,\
+		test_winreg_QueryValue(tctx, winreg_handle, &key_handle, wname,\
+				       &w_type, &w_size, &w_length, &w_data),\
+		"failed to query winreg");\
+	torture_assert_int_equal(tctx, w_type, REG_SZ, "unexpected type");\
+	blob = data_blob(w_data, w_size);\
+	str = reg_val_data_string(tctx, lp_iconv_convenience(tctx->lp_ctx), REG_SZ, blob);\
+	if (w_size == 2 && iname == NULL) {\
+		/*torture_comment(tctx, "%s: \"\", %s: (null)\n", #wname, #iname);\ */\
+	} else {\
+		torture_assert_str_equal(tctx, str, iname,\
+			talloc_asprintf(tctx, "%s - %s mismatch", #wname, #iname));\
+	}\
+} while(0);
+
+#define test_dword(key, wname, iname) \
+do {\
+	uint32_t value;\
+	enum winreg_Type w_type;\
+	uint32_t w_size;\
+	uint32_t w_length;\
+	uint8_t *w_data;\
+	torture_assert(tctx,\
+		test_winreg_QueryValue(tctx, winreg_handle, &key_handle, wname,\
+				       &w_type, &w_size, &w_length, &w_data),\
+		"failed to query winreg");\
+	torture_assert_int_equal(tctx, w_type, REG_DWORD, "unexpected type");\
+	torture_assert_int_equal(tctx, w_size, 4, "unexpected size");\
+	torture_assert_int_equal(tctx, w_length, 4, "unexpected length");\
+	value = IVAL(w_data, 0);\
+	torture_assert_int_equal(tctx, value, iname,\
+		talloc_asprintf(tctx, "%s - %s mismatch", #wname, #iname));\
+} while(0);
+
+#define test_dm(key, wname, iname) \
+do {\
+	DATA_BLOB blob;\
+	struct spoolss_DeviceMode dm;\
+	enum ndr_err_code ndr_err;\
+	enum winreg_Type w_type;\
+	uint32_t w_size;\
+	uint32_t w_length;\
+	uint8_t *w_data;\
+	torture_assert(tctx,\
+		test_winreg_QueryValue(tctx, winreg_handle, &key_handle, wname,\
+				       &w_type, &w_size, &w_length, &w_data),\
+		"failed to query winreg");\
+	torture_assert_int_equal(tctx, w_type, REG_BINARY, "unexpected type");\
+	blob = data_blob(w_data, w_size);\
+	ndr_err = ndr_pull_struct_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), &dm,\
+		(ndr_pull_flags_fn_t)ndr_pull_spoolss_DeviceMode);\
+	torture_assert_ndr_success(tctx, ndr_err, "failed to unmarshall dm");\
+	torture_assert(tctx, test_devicemode_equal(tctx, &dm, iname),\
+		"dm unequal");\
+} while(0);
+
+#define test_sd(key, wname, iname) \
+do {\
+	DATA_BLOB blob;\
+	struct security_descriptor sd;\
+	enum ndr_err_code ndr_err;\
+	enum winreg_Type w_type;\
+	uint32_t w_size;\
+	uint32_t w_length;\
+	uint8_t *w_data;\
+	torture_assert(tctx,\
+		test_winreg_QueryValue(tctx, winreg_handle, &key_handle, wname,\
+				       &w_type, &w_size, &w_length, &w_data),\
+		"failed to query winreg");\
+	torture_assert_int_equal(tctx, w_type, REG_BINARY, "unexpected type");\
+	blob = data_blob(w_data, w_size);\
+	ndr_err = ndr_pull_struct_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), &sd,\
+		(ndr_pull_flags_fn_t)ndr_pull_security_descriptor);\
+	torture_assert_ndr_success(tctx, ndr_err, "failed to unmarshall sd");\
+	torture_assert(tctx, test_security_descriptor_equal(tctx, &sd, iname),\
+		"sd unequal");\
+} while(0);
+
+	for (i=0; i < ARRAY_SIZE(keys); i++) {
+
+		const char *printer_key;
+		struct policy_handle key_handle;
+
+		printer_key = talloc_asprintf(tctx, "%s\\%s",
+			keys[i], printer_name);
+
+		torture_assert(tctx,
+			test_winreg_OpenKey(tctx, winreg_handle, hive_handle, printer_key, &key_handle), "");
+
+		test_sz(keys[i], "Name", info.info2.printername);
+		test_sz(keys[i], "Share Name", info.info2.sharename);
+		test_sz(keys[i], "Port", info.info2.portname);
+		test_sz(keys[i], "Printer Driver", info.info2.drivername);
+		test_sz(keys[i], "Description", info.info2.comment);
+		test_sz(keys[i], "Location", info.info2.location);
+		test_sz(keys[i], "Separator File", info.info2.sepfile);
+		test_sz(keys[i], "Print Processor", info.info2.printprocessor);
+		test_sz(keys[i], "Datatype", info.info2.datatype);
+		test_sz(keys[i], "Parameters", info.info2.parameters);
+		/* winreg: 0, spoolss not */
+/*		test_dword(keys[i], "Attributes", info.info2.attributes); */
+		test_dword(keys[i], "Priority", info.info2.priority);
+		test_dword(keys[i], "Default Priority", info.info2.defaultpriority);
+		/* winreg: 60, spoolss: 0 */
+/*		test_dword(keys[i], "StartTime", info.info2.starttime); */
+/*		test_dword(keys[i], "UntilTime", info.info2.untiltime); */
+		/* winreg != spoolss */
+/*		test_dword(keys[i], "Status", info.info2.status); */
+		test_dm(keys[i], "Default DevMode", info.info2.devmode);
+		test_sd(keys[i], "Security", info.info2.secdesc);
+
+		torture_assert(tctx,
+			test_winreg_CloseKey(tctx, winreg_handle, &key_handle), "");
+	}
+
+#undef test_sz
+#undef test_dword
+#undef test_dm
+#undef test_sd
+
+	torture_comment(tctx, "Printer Info and winreg consistency test succeeded\n\n");
+
+	return true;
+}
+
 static bool test_SetPrinterData(struct torture_context *tctx,
 				struct dcerpc_binding_handle *b,
 				struct policy_handle *handle,
@@ -4231,6 +4370,33 @@ static bool test_Forms_winreg(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_PrinterInfo_winreg(struct torture_context *tctx,
+				    struct dcerpc_pipe *p,
+				    struct policy_handle *handle,
+				    const char *printer_name)
+{
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	struct dcerpc_pipe *p2;
+	bool ret = true;
+	struct policy_handle hive_handle;
+	struct dcerpc_binding_handle *b2;
+
+	torture_assert_ntstatus_ok(tctx,
+		torture_rpc_connection(tctx, &p2, &ndr_table_winreg),
+		"could not open winreg pipe");
+	b2 = p2->binding_handle;
+
+	torture_assert(tctx, test_winreg_OpenHKLM(tctx, b2, &hive_handle), "");
+
+	ret = test_GetPrinterInfo_winreg(tctx, b, handle, printer_name, b2, &hive_handle);
+
+	test_winreg_CloseKey(tctx, b2, &hive_handle);
+
+	talloc_free(p2);
+
+	return ret;
+}
+
 static bool test_GetChangeID_PrinterData(struct torture_context *tctx,
 					 struct dcerpc_binding_handle *b,
 					 struct policy_handle *handle,
@@ -4815,8 +4981,7 @@ static bool test_EnumPrinters_old(struct torture_context *tctx,
 		torture_assert_ntstatus_ok(tctx, status, "EnumPrinters failed");
 
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-			data_blob_clear(&blob);
+			DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 			r.in.buffer = &blob;
 			r.in.offered = needed;
 			status = dcerpc_spoolss_EnumPrinters_r(b, tctx, &r);
@@ -4879,8 +5044,7 @@ static bool test_GetPrinterDriver(struct torture_context *tctx,
 	torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver_r(b, tctx, &r),
 		"failed to call GetPrinterDriver");
 	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		r.in.buffer = &blob;
 		r.in.offered = needed;
 		torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver_r(b, tctx, &r),
@@ -4928,8 +5092,7 @@ static bool test_GetPrinterDriver2(struct torture_context *tctx,
 		torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver2_r(b, tctx, &r),
 			"failed to call GetPrinterDriver2");
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-			data_blob_clear(&blob);
+			DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 			r.in.buffer = &blob;
 			r.in.offered = needed;
 			torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver2_r(b, tctx, &r),
@@ -4987,8 +5150,7 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
 		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed");
 
 		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-			data_blob_clear(&blob);
+			DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 			r.in.buffer = &blob;
 			r.in.offered = needed;
 			status = dcerpc_spoolss_EnumPrinterDrivers_r(b, tctx, &r);
@@ -5055,8 +5217,7 @@ static bool test_EnumPrinters_findname(struct torture_context *tctx,
 		"failed to enum printers");
 
 	if (W_ERROR_EQUAL(e.out.result, WERR_INSUFFICIENT_BUFFER)) {
-		DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
-		data_blob_clear(&blob);
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
 		e.in.buffer = &blob;
 		e.in.offered = needed;
 
@@ -5556,6 +5717,10 @@ static bool test_one_printer(struct torture_context *tctx,
 		ret = false;
 	}
 
+	if (!test_PrinterInfo_winreg(tctx, p, handle, name)) {
+		ret = false;
+	}
+
 	if (!test_ChangeID(tctx, p, handle)) {
 		ret = false;
 	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list