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 <[email protected]>
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 <[email protected]>
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

Reply via email to