The branch, master has been updated
       via  fc16baa s3-net: use struct based dcerpc_spoolss_EnumPrinterData_r() 
call.
       via  d4414f0 s3-rpcclient: use struct based 
dcerpc_spoolss_EnumPrinterData_r() call.
      from  7182da7 s4-smbtorture: add (disabled) ndr torture test to check for 
a w2k samlogon reply we can't currently parse.

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


- Log -----------------------------------------------------------------
commit fc16baaf91f21addb42d41d60a1d0453c00843b2
Author: Günther Deschner <[email protected]>
Date:   Fri Jan 28 18:17:00 2011 +0100

    s3-net: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
    
    This is a workaround for a string issue we currently have with argument 
based
    generated dcerpc client code (see bug #7804 for details).
    
    Guenther
    
    Autobuild-User: Günther Deschner <[email protected]>
    Autobuild-Date: Fri Jan 28 22:05:20 CET 2011 on sn-devel-104

commit d4414f08cb5e52d03ddd07b21d07cb4e9516c53c
Author: Günther Deschner <[email protected]>
Date:   Fri Jan 28 18:07:07 2011 +0100

    s3-rpcclient: use struct based dcerpc_spoolss_EnumPrinterData_r() call.
    
    This is a workaround for a string issue we currently have with argument 
based
    generated dcerpc client code (see bug #7804 for details).
    
    Guenther

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

Summary of changes:
 source3/rpcclient/cmd_spoolss.c |   85 ++++++++++++++++++--------------------
 source3/utils/net_rpc_printer.c |   76 +++++++++++++++-------------------
 2 files changed, 74 insertions(+), 87 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index 3e6752c..248996e 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -2972,17 +2972,13 @@ static WERROR cmd_spoolss_enum_data(struct 
rpc_pipe_client *cli,
 {
        WERROR result;
        NTSTATUS status;
-       uint32_t i = 0;
        const char *printername;
        struct policy_handle hnd;
-       uint32_t value_offered = 0;
-       const char *value_name = NULL;
        uint32_t value_needed;
        enum winreg_Type type;
-       uint8_t *data = NULL;
-       uint32_t data_offered = 0;
        uint32_t data_needed;
        struct dcerpc_binding_handle *b = cli->binding_handle;
+       struct spoolss_EnumPrinterData r;
 
        if (argc != 2) {
                printf("Usage: %s printername\n", argv[0]);
@@ -3003,53 +2999,55 @@ static WERROR cmd_spoolss_enum_data(struct 
rpc_pipe_client *cli,
 
        /* Enumerate data */
 
-       status = dcerpc_spoolss_EnumPrinterData(b, mem_ctx,
-                                               &hnd,
-                                               i,
-                                               value_name,
-                                               value_offered,
-                                               &value_needed,
-                                               &type,
-                                               data,
-                                               data_offered,
-                                               &data_needed,
-                                               &result);
-
+       r.in.handle = &hnd;
+       r.in.enum_index = 0;
+       r.in.value_offered = 0;
+       r.in.data_offered = 0;
+       r.out.value_name = NULL;
+       r.out.value_needed = &value_needed;
+       r.out.type = &type;
+       r.out.data = NULL;
+       r.out.data_needed = &data_needed;
+
+       status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
        if (!NT_STATUS_IS_OK(status)) {
                result = ntstatus_to_werror(status);
                goto done;
        }
 
-       if (!W_ERROR_IS_OK(result)) {
+       if (!W_ERROR_IS_OK(r.out.result)) {
+               result = r.out.result;
                goto done;
        }
 
-       data_offered    = data_needed;
-       value_offered   = value_needed;
-       data            = talloc_zero_array(mem_ctx, uint8_t, data_needed);
-       value_name      = talloc_zero_array(mem_ctx, char, value_needed);
+       r.in.data_offered       = *r.out.data_needed;
+       r.in.value_offered      = *r.out.value_needed;
+       r.out.data              = talloc_zero_array(mem_ctx, uint8_t, 
r.in.data_offered);
+       r.out.value_name        = talloc_zero_array(mem_ctx, char, 
r.in.value_offered);
+
+       do {
+
+               status = dcerpc_spoolss_EnumPrinterData_r(b, mem_ctx, &r);
+               if (!NT_STATUS_IS_OK(status)) {
+                       result = ntstatus_to_werror(status);
+                       goto done;
+               }
+
+               if (W_ERROR_EQUAL(r.out.result, WERR_NO_MORE_ITEMS)) {
+                       result = WERR_OK;
+                       break;
+               }
 
-       while (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
+               r.in.enum_index++;
 
-               status = dcerpc_spoolss_EnumPrinterData(b, mem_ctx,
-                                                       &hnd,
-                                                       i++,
-                                                       value_name,
-                                                       value_offered,
-                                                       &value_needed,
-                                                       &type,
-                                                       data,
-                                                       data_offered,
-                                                       &data_needed,
-                                                       &result);
-               if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(result)) {
+               {
                        struct regval_blob *v;
 
                        v = regval_compose(talloc_tos(),
-                                          value_name,
-                                          type,
-                                          data,
-                                          data_offered);
+                                          r.out.value_name,
+                                          *r.out.type,
+                                          r.out.data,
+                                          r.in.data_offered);
                        if (v == NULL) {
                                result = WERR_NOMEM;
                                goto done;
@@ -3058,11 +3056,8 @@ static WERROR cmd_spoolss_enum_data(struct 
rpc_pipe_client *cli,
                        display_reg_value(v);
                        talloc_free(v);
                }
-       }
 
-       if (W_ERROR_V(result) == ERRnomoreitems) {
-               result = W_ERROR(ERRsuccess);
-       }
+       } while (W_ERROR_IS_OK(r.out.result));
 
 done:
        if (is_valid_policy_hnd(&hnd)) {
diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c
index 24442fe..0375490 100644
--- a/source3/utils/net_rpc_printer.c
+++ b/source3/utils/net_rpc_printer.c
@@ -2255,7 +2255,7 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct 
net_context *c,
 
        WERROR result;
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-       uint32_t i = 0, p = 0, j = 0;
+       uint32_t i = 0, j = 0;
        uint32_t num_printers;
        uint32_t level = 2;
        const char *printername, *sharename;
@@ -2306,11 +2306,10 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct 
net_context *c,
        /* do something for all printers */
        for (i = 0; i < num_printers; i++) {
 
-               uint32_t value_offered = 0, value_needed;
-               uint32_t data_offered = 0, data_needed;
+               uint32_t value_needed;
+               uint32_t data_needed;
                enum winreg_Type type;
-               uint8_t *buffer = NULL;
-               const char *value_name = NULL;
+               struct spoolss_EnumPrinterData r;
 
                /* do some initialization */
                printername = info_enum[i].info2.printername;
@@ -2402,50 +2401,43 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct 
net_context *c,
                   FIXME: IIRC I've seen it too on a win2k-server
                */
 
+               r.in.handle = &hnd_src;
+               r.in.enum_index = 0;
+               r.in.value_offered = 0;
+               r.in.data_offered = 0;
+               r.out.value_name = NULL;
+               r.out.value_needed = &value_needed;
+               r.out.type = &type;
+               r.out.data = NULL;
+               r.out.data_needed = &data_needed;
+
                /* enumerate data on src handle */
-               nt_status = dcerpc_spoolss_EnumPrinterData(b_src, mem_ctx,
-                                                          &hnd_src,
-                                                          p,
-                                                          value_name,
-                                                          value_offered,
-                                                          &value_needed,
-                                                          &type,
-                                                          buffer,
-                                                          data_offered,
-                                                          &data_needed,
-                                                          &result);
-
-               data_offered    = data_needed;
-               value_offered   = value_needed;
-               buffer          = talloc_zero_array(mem_ctx, uint8_t, 
data_needed);
-               value_name      = talloc_zero_array(mem_ctx, char, 
value_needed);
+               nt_status = dcerpc_spoolss_EnumPrinterData_r(b_src, mem_ctx, 
&r);
+
+               r.in.data_offered       = *r.out.data_needed;
+               r.in.value_offered      = *r.out.value_needed;
+               r.out.data              = talloc_zero_array(mem_ctx, uint8_t, 
r.in.data_offered);
+               r.out.value_name        = talloc_zero_array(mem_ctx, char, 
r.in.value_offered);
 
                /* loop for all printerdata of "PrinterDriverData" */
-               while (NT_STATUS_IS_OK(nt_status) && W_ERROR_IS_OK(result)) {
-
-                       nt_status = dcerpc_spoolss_EnumPrinterData(b_src, 
mem_ctx,
-                                                                  &hnd_src,
-                                                                  p++,
-                                                                  value_name,
-                                                                  
value_offered,
-                                                                  
&value_needed,
-                                                                  &type,
-                                                                  buffer,
-                                                                  data_offered,
-                                                                  &data_needed,
-                                                                  &result);
+               while (NT_STATUS_IS_OK(nt_status) && 
W_ERROR_IS_OK(r.out.result)) {
+
+                       r.in.enum_index++;
+
+                       nt_status = dcerpc_spoolss_EnumPrinterData_r(b_src, 
mem_ctx, &r);
+
                        /* loop for all reg_keys */
-                       if (NT_STATUS_IS_OK(nt_status) && 
W_ERROR_IS_OK(result)) {
+                       if (NT_STATUS_IS_OK(nt_status) && 
W_ERROR_IS_OK(r.out.result)) {
 
                                /* display_value */
                                if (c->opt_verbose) {
                                        struct regval_blob *v;
 
                                        v = regval_compose(talloc_tos(),
-                                                          value_name,
-                                                          type,
-                                                          buffer,
-                                                          data_offered);
+                                                          r.out.value_name,
+                                                          *r.out.type,
+                                                          r.out.data,
+                                                          r.in.data_offered);
                                        if (v == NULL) {
                                                nt_status = NT_STATUS_NO_MEMORY;
                                                goto done;
@@ -2457,12 +2449,12 @@ NTSTATUS rpc_printer_migrate_settings_internals(struct 
net_context *c,
 
                                /* set_value */
                                if (!net_spoolss_setprinterdata(pipe_hnd_dst, 
mem_ctx,
-                                                               &hnd_dst, 
value_name,
-                                                               type, buffer, 
data_offered))
+                                                               &hnd_dst, 
r.out.value_name,
+                                                               *r.out.type, 
r.out.data, r.in.data_offered))
                                        goto done;
 
                                DEBUGADD(1,("\tSetPrinterData of [%s] 
succeeded\n",
-                                           value_name));
+                                           r.out.value_name));
                        }
                }
 


-- 
Samba Shared Repository

Reply via email to