s3-spoolss: fix enumprinter key client and server.
authorGünther Deschner <gd@samba.org>
Thu, 10 Dec 2009 13:20:22 +0000 (14:20 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 10 Dec 2009 16:48:50 +0000 (17:48 +0100)
Guenther

source3/rpc_client/cli_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index 047cb709ac1a4c1ac48ce136e4eac5a73b5ee32e..d0781a0e65025047a2b8fb0cc1889cb3f96f8094 100644 (file)
@@ -810,11 +810,13 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli,
        NTSTATUS status;
        WERROR werror;
        uint32_t needed;
-       struct spoolss_StringArray2 _key_buffer;
+       union spoolss_KeyNames _key_buffer;
+       uint32_t _ndr_size;
 
        status = rpccli_spoolss_EnumPrinterKey(cli, mem_ctx,
                                               handle,
                                               key_name,
+                                              &_ndr_size,
                                               &_key_buffer,
                                               offered,
                                               &needed,
@@ -825,13 +827,14 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli,
                status = rpccli_spoolss_EnumPrinterKey(cli, mem_ctx,
                                                       handle,
                                                       key_name,
+                                                      &_ndr_size,
                                                       &_key_buffer,
                                                       offered,
                                                       &needed,
                                                       &werror);
        }
 
-       *key_buffer = _key_buffer.string;
+       *key_buffer = _key_buffer.string_array;
 
        return werror;
 }
index 1e66c7c021cb051768bd2ab06e2ea372ef22c290..0028ec01880711fedb226ec45501d2833a09f46b 100644 (file)
@@ -8786,12 +8786,20 @@ WERROR _spoolss_EnumPrinterKey(pipes_struct *p,
                goto done;
        }
 
-       array = talloc_zero_array(r->out.key_buffer, const char *, num_keys + 1);
+       array = talloc_zero_array(r->out.key_buffer, const char *, num_keys + 2);
        if (!array) {
                result = WERR_NOMEM;
                goto done;
        }
 
+       if (!num_keys) {
+               array[0] = talloc_strdup(array, "");
+               if (!array[0]) {
+                       result = WERR_NOMEM;
+                       goto done;
+               }
+       }
+
        for (i=0; i < num_keys; i++) {
 
                DEBUG(10,("_spoolss_EnumPrinterKey: adding keyname: %s\n",
@@ -8809,13 +8817,14 @@ WERROR _spoolss_EnumPrinterKey(pipes_struct *p,
                goto done;
        }
 
+       *r->out._ndr_size = r->in.offered / 2;
        *r->out.needed = blob.length;
 
        if (r->in.offered < *r->out.needed) {
                result = WERR_MORE_DATA;
        } else {
                result = WERR_OK;
-               r->out.key_buffer->string = array;
+               r->out.key_buffer->string_array = array;
        }
 
  done: