From: Günther Deschner Date: Thu, 10 Dec 2009 13:20:22 +0000 (+0100) Subject: s3-spoolss: fix enumprinter key client and server. X-Git-Tag: samba-4.0.0alpha11~655 X-Git-Url: http://git.samba.org/samba.git/?p=ira%2Fwip.git;a=commitdiff_plain;h=f20effc437970d826c5bd4f047ff47e23e7a1a73 s3-spoolss: fix enumprinter key client and server. Guenther --- diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c index 047cb709ac1..d0781a0e650 100644 --- a/source3/rpc_client/cli_spoolss.c +++ b/source3/rpc_client/cli_spoolss.c @@ -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; } diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 1e66c7c021c..0028ec01880 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -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: