s3-spoolss: fix _spoolss_GetPrinterDataEx after IDL change.
authorGünther Deschner <gd@samba.org>
Thu, 4 Mar 2010 14:39:59 +0000 (15:39 +0100)
committerKarolin Seeger <kseeger@samba.org>
Thu, 6 May 2010 12:08:32 +0000 (14:08 +0200)
Guenther
(cherry picked from commit fbb6d00eed6bca960aa53a5967a2dea426cacfe2)
(cherry picked from commit 017c4ac6c1c2a19345d1f79acf8179a995f38cb5)

source3/rpc_server/srv_spoolss_nt.c

index 8a6ae66ac1827a94599fa50f2015ba9891db8acd..5808b082dec057112984b965c34a636c7a5ebdc6 100644 (file)
@@ -8992,11 +8992,29 @@ WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
 
        if (Printer->printer_type == SPLHND_SERVER) {
 
+               union spoolss_PrinterData data;
+
                result = getprinterdata_printer_server(p->mem_ctx,
                                                       r->in.value_name,
                                                       r->out.type,
-                                                      r->out.data);
-               goto done;
+                                                      &data);
+               if (!W_ERROR_IS_OK(result)) {
+                       goto done;
+               }
+
+               result = push_spoolss_PrinterData(p->mem_ctx, &blob,
+                                                 *r->out.type, &data);
+               if (!W_ERROR_IS_OK(result)) {
+                       goto done;
+               }
+
+               *r->out.needed = blob.length;
+
+               if (r->in.offered >= *r->out.needed) {
+                       memcpy(r->out.data, blob.data, blob.length);
+               }
+
+               return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
        }
 
        if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
@@ -9021,8 +9039,10 @@ WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
            strequal(r->in.value_name, "ChangeId")) {
                *r->out.type = REG_DWORD;
                *r->out.needed = 4;
-               r->out.data->value = printer->info_2->changeid;
-               result = WERR_OK;
+               if (r->in.offered >= *r->out.needed) {
+                       SIVAL(r->out.data, 0, printer->info_2->changeid);
+                       result = WERR_OK;
+               }
                goto done;
        }
 
@@ -9043,12 +9063,9 @@ WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
        *r->out.needed = regval_size(val);
        *r->out.type = regval_type(val);
 
-       blob = data_blob_const(regval_data_p(val), regval_size(val));
-
-       result = pull_spoolss_PrinterData(p->mem_ctx, &blob,
-                                         r->out.data,
-                                         *r->out.type);
-
+       if (r->in.offered >= *r->out.needed) {
+               memcpy(r->out.data, regval_data_p(val), regval_size(val));
+       }
  done:
        if (printer) {
                free_a_printer(&printer, 2);
@@ -9058,7 +9075,6 @@ WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
                return result;
        }
 
-       *r->out.needed  = ndr_size_spoolss_PrinterData(r->out.data, *r->out.type, NULL, 0);
        *r->out.type    = SPOOLSS_BUFFER_OK(*r->out.type, REG_NONE);
        r->out.data     = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);