The Samba-Bugzilla – Attachment 5068 Details for
Bug 6883
Add Printer fails with 0x000006f7 on Windows 7
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
remaining patch from master
patch-v3-4-test (text/plain), 37.14 KB, created by
Guenther Deschner
on 2009-12-09 05:14:59 UTC
(
hide
)
Description:
remaining patch from master
Filename:
MIME Type:
Creator:
Guenther Deschner
Created:
2009-12-09 05:14:59 UTC
Size:
37.14 KB
patch
obsolete
>From a33a7d7b4b40f19a0106f8e6eff8402d72d8d2fa Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Mon, 23 Nov 2009 13:35:32 +0100 >Subject: [PATCH 1/6] s4-smbtorture: fix spoolss_EnumPrinterKey client in RPC-SPOOLSS-WIN. > >Guenther >--- > source4/torture/rpc/spoolss_win.c | 22 ++++++++++++++++++---- > 1 files changed, 18 insertions(+), 4 deletions(-) > >diff --git a/source4/torture/rpc/spoolss_win.c b/source4/torture/rpc/spoolss_win.c >index 719d8e2..df1a47d 100644 >--- a/source4/torture/rpc/spoolss_win.c >+++ b/source4/torture/rpc/spoolss_win.c >@@ -23,6 +23,7 @@ > #include "torture/rpc/rpc.h" > #include "librpc/gen_ndr/ndr_spoolss_c.h" > #include "rpc_server/dcerpc_server.h" >+#include "librpc/gen_ndr/ndr_misc.h" > #include "ntvfs/ntvfs.h" > #include "param/param.h" > >@@ -177,7 +178,7 @@ static bool test_GetPrinterData(struct torture_context *tctx, > if (W_ERROR_IS_OK(expected_werr)) { > torture_assert_int_equal(tctx, data.value, > expected_value, >- "GetPrinterData did not return expected value."); >+ talloc_asprintf(tctx, "GetPrinterData for %s did not return expected value.", value_name)); > } > return true; > } >@@ -385,15 +386,17 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > NTSTATUS status; > struct spoolss_EnumPrinterKey epk; > uint32_t needed = 0; >- const char **key_buffer = NULL; >+ uint16_t *key_buffer; > > torture_comment(tctx, "Testing EnumPrinterKey(%s)\n", key); > >+ key_buffer = talloc_zero_array(tctx, uint16_t, 0); >+ > epk.in.handle = handle; > epk.in.key_name = talloc_strdup(tctx, key); > epk.in.offered = 0; > epk.out.needed = &needed; >- epk.out.key_buffer = &key_buffer; >+ epk.out.key_buffer = key_buffer; > > status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk); > torture_assert_ntstatus_ok(tctx, status, "EnumPrinterKey failed"); >@@ -401,6 +404,8 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > > if (W_ERROR_EQUAL(epk.out.result, WERR_MORE_DATA)) { > epk.in.offered = needed; >+ key_buffer = talloc_zero_array(tctx, uint16_t, needed/2); >+ epk.out.key_buffer = key_buffer; > status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk); > torture_assert_ntstatus_ok(tctx, status, > "EnumPrinterKey failed"); >@@ -408,7 +413,16 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > > torture_assert_werr_ok(tctx, epk.out.result, "EnumPrinterKey failed"); > >- ctx->printer_keys = key_buffer; >+ { >+ union winreg_Data data; >+ enum ndr_err_code ndr_err; >+ DATA_BLOB blob = data_blob_const(key_buffer, needed); >+ ndr_err = ndr_pull_union_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), >+ &data, REG_MULTI_SZ, >+ (ndr_pull_flags_fn_t)ndr_pull_winreg_Data); >+ torture_assert_ndr_success(tctx, ndr_err, "failed to pull REG_MULTI_SZ"); >+ ctx->printer_keys = data.string_array; >+ } > > return true; > } >-- >1.6.5.2 > > >From 41750d2e48ba21c3967343d168610ebb5dcd0ae2 Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Fri, 20 Nov 2009 16:33:29 +0100 >Subject: [PATCH 2/6] s4-smbtorture: add tests for spoolss_EnumPrinterKey to RPC-SPOOLSS-PRINTER. > >Guenther >--- > source4/torture/rpc/spoolss.c | 73 +++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 73 insertions(+), 0 deletions(-) > >diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c >index bfe6672..895f6b9 100644 >--- a/source4/torture/rpc/spoolss.c >+++ b/source4/torture/rpc/spoolss.c >@@ -23,7 +23,9 @@ > #include "includes.h" > #include "torture/torture.h" > #include "torture/rpc/rpc.h" >+#include "librpc/gen_ndr/ndr_misc.h" > #include "librpc/gen_ndr/ndr_spoolss_c.h" >+#include "param/param.h" > > struct test_spoolss_context { > /* print server handle */ >@@ -2000,6 +2002,77 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx, > return true; > } > >+bool test_printer_keys(struct torture_context *tctx, >+ struct dcerpc_pipe *p, >+ struct policy_handle *handle) >+{ >+ DATA_BLOB blob; >+ const char **key_array = NULL; >+ int i; >+ >+ { >+ struct spoolss_EnumPrinterKey r; >+ uint32_t needed; >+ uint16_t *key_buffer = talloc_zero_array(tctx, uint16_t, 0); >+ >+ r.in.handle = handle; >+ r.in.key_name = ""; >+ r.in.offered = 0; >+ r.out.key_buffer = key_buffer; >+ r.out.needed = &needed; >+ >+ torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r), >+ "failed to call EnumPrinterKey"); >+ if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { >+ r.in.offered = needed; >+ key_buffer = talloc_zero_array(tctx, uint16_t, needed/2); >+ r.out.key_buffer = key_buffer; >+ torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r), >+ "failed to call EnumPrinterKey"); >+ } >+ torture_assert_werr_ok(tctx, r.out.result, >+ "failed to call EnumPrinterKey"); >+ >+ blob = data_blob_const(key_buffer, needed); >+ } >+ >+ { >+ union winreg_Data data; >+ enum ndr_err_code ndr_err; >+ ndr_err = ndr_pull_union_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), >+ &data, REG_MULTI_SZ, >+ (ndr_pull_flags_fn_t)ndr_pull_winreg_Data); >+ torture_assert_ndr_success(tctx, ndr_err, "failed to pull REG_MULTI_SZ"); >+ key_array = data.string_array; >+ } >+ >+ for (i=0; key_array[i]; i++) { >+ struct spoolss_EnumPrinterDataEx r; >+ uint32_t count; >+ struct spoolss_PrinterEnumValues *info; >+ uint32_t needed; >+ >+ r.in.handle = handle; >+ r.in.key_name = key_array[i]; >+ r.in.offered = 0; >+ r.out.count = &count; >+ r.out.info = &info; >+ r.out.needed = &needed; >+ >+ torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r), >+ "failed to call EnumPrinterDataEx"); >+ if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { >+ r.in.offered = needed; >+ torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r), >+ "failed to call EnumPrinterDataEx"); >+ } >+ torture_assert_werr_ok(tctx, r.out.result, >+ "failed to call EnumPrinterDataEx"); >+ } >+ >+ return true; >+} >+ > bool torture_rpc_spoolss(struct torture_context *torture) > { > NTSTATUS status; >-- >1.6.5.2 > > >From cb830d3e120f22bc550f99f2ea6792ceb1fb8b4a Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Wed, 2 Dec 2009 14:22:52 +0100 >Subject: [PATCH 3/6] spoolss: add spoolss_StringArray2. > >The difference to spoolss_StringArray is that in spoolss_StringArray2 the string >array is put into a subcontext of _ndr_size. > >Guenther >--- > librpc/gen_ndr/ndr_spoolss.c | 53 ++++++++++++++++++++++++++++++++++++++++++ > librpc/gen_ndr/ndr_spoolss.h | 3 ++ > librpc/gen_ndr/spoolss.h | 5 ++++ > librpc/idl/spoolss.idl | 5 ++++ > librpc/ndr/ndr_spoolss_buf.c | 9 +++++++ > librpc/ndr/ndr_spoolss_buf.h | 1 + > 6 files changed, 76 insertions(+), 0 deletions(-) > >diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c >index d03196e..0b67e80 100644 >--- a/librpc/gen_ndr/ndr_spoolss.c >+++ b/librpc/gen_ndr/ndr_spoolss.c >@@ -7421,6 +7421,59 @@ _PUBLIC_ void ndr_print_spoolss_StringArray(struct ndr_print *ndr, const char *n > ndr->depth--; > } > >+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_StringArray2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray2 *r) >+{ >+ if (ndr_flags & NDR_SCALARS) { >+ NDR_CHECK(ndr_push_align(ndr, 4)); >+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2)); >+ { >+ uint32_t _flags_save_string_array = ndr->flags; >+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >+ { >+ struct ndr_push *_ndr_string; >+ NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_string, 0, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2 * 2)); >+ NDR_CHECK(ndr_push_string_array(_ndr_string, NDR_SCALARS, r->string)); >+ NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_string, 0, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2 * 2)); >+ } >+ ndr->flags = _flags_save_string_array; >+ } >+ } >+ if (ndr_flags & NDR_BUFFERS) { >+ } >+ return NDR_ERR_SUCCESS; >+} >+ >+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_StringArray2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray2 *r) >+{ >+ if (ndr_flags & NDR_SCALARS) { >+ NDR_CHECK(ndr_pull_align(ndr, 4)); >+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size)); >+ { >+ uint32_t _flags_save_string_array = ndr->flags; >+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >+ { >+ struct ndr_pull *_ndr_string; >+ NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_string, 0, r->_ndr_size * 2)); >+ NDR_CHECK(ndr_pull_string_array(_ndr_string, NDR_SCALARS, &r->string)); >+ NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_string, 0, r->_ndr_size * 2)); >+ } >+ ndr->flags = _flags_save_string_array; >+ } >+ } >+ if (ndr_flags & NDR_BUFFERS) { >+ } >+ return NDR_ERR_SUCCESS; >+} >+ >+_PUBLIC_ void ndr_print_spoolss_StringArray2(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray2 *r) >+{ >+ ndr_print_struct(ndr, name, "spoolss_StringArray2"); >+ ndr->depth++; >+ ndr_print_uint32(ndr, "_ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?(ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2:r->_ndr_size); >+ ndr_print_string_array(ndr, "string", r->string); >+ ndr->depth--; >+} >+ > static enum ndr_err_code ndr_push_spoolss_AddDriverInfo1(struct ndr_push *ndr, int ndr_flags, const struct spoolss_AddDriverInfo1 *r) > { > if (ndr_flags & NDR_SCALARS) { >diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h >index 204aad8..fbf056f 100644 >--- a/librpc/gen_ndr/ndr_spoolss.h >+++ b/librpc/gen_ndr/ndr_spoolss.h >@@ -303,6 +303,9 @@ void ndr_print_spoolss_SetPrinterInfoCtr(struct ndr_print *ndr, const char *name > enum ndr_err_code ndr_push_spoolss_StringArray(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray *r); > enum ndr_err_code ndr_pull_spoolss_StringArray(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray *r); > void ndr_print_spoolss_StringArray(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray *r); >+enum ndr_err_code ndr_push_spoolss_StringArray2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray2 *r); >+enum ndr_err_code ndr_pull_spoolss_StringArray2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray2 *r); >+void ndr_print_spoolss_StringArray2(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray2 *r); > void ndr_print_spoolss_AddDriverInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_AddDriverInfo1 *r); > enum ndr_err_code ndr_push_spoolss_DriverOSVersion(struct ndr_push *ndr, int ndr_flags, enum spoolss_DriverOSVersion r); > enum ndr_err_code ndr_pull_spoolss_DriverOSVersion(struct ndr_pull *ndr, int ndr_flags, enum spoolss_DriverOSVersion *r); >diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h >index 2053065..1d2cf5b 100644 >--- a/librpc/gen_ndr/spoolss.h >+++ b/librpc/gen_ndr/spoolss.h >@@ -723,6 +723,11 @@ struct spoolss_StringArray { > const char ** string;/* [flag(LIBNDR_FLAG_STR_NULLTERM)] */ > }/* [public] */; > >+struct spoolss_StringArray2 { >+ uint32_t _ndr_size;/* [value((ndr_size_spoolss_StringArray2(r,ndr->iconv_convenience,ndr->flags)-4)/2)] */ >+ const char ** string;/* [subcontext_size(_ndr_size*2),subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */ >+}/* [public] */; >+ > struct spoolss_AddDriverInfo1 { > const char *driver_name;/* [unique,charset(UTF16)] */ > }; >diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl >index e4f03e5..cb34138 100644 >--- a/librpc/idl/spoolss.idl >+++ b/librpc/idl/spoolss.idl >@@ -786,6 +786,11 @@ import "misc.idl", "security.idl", "winreg.idl"; > /*[subcontext(0),subcontext_size(_ndr_size*2)]*/ nstring_array string; > } spoolss_StringArray; > >+ typedef [public] struct { >+ [value((ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags)-4)/2)] uint32 _ndr_size; >+ [subcontext(0),subcontext_size(_ndr_size*2)] nstring_array string; >+ } spoolss_StringArray2; >+ > typedef struct { > [string,charset(UTF16)] uint16 *driver_name; > } spoolss_AddDriverInfo1; >diff --git a/librpc/ndr/ndr_spoolss_buf.c b/librpc/ndr/ndr_spoolss_buf.c >index 0acae3d..9968e90 100644 >--- a/librpc/ndr/ndr_spoolss_buf.c >+++ b/librpc/ndr/ndr_spoolss_buf.c >@@ -708,6 +708,15 @@ _PUBLIC_ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r > return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic); > } > >+_PUBLIC_ size_t ndr_size_spoolss_StringArray2(const struct spoolss_StringArray2 *r, struct smb_iconv_convenience *ic, int flags) >+{ >+ if (!r) { >+ return 4; >+ } >+ >+ return ndr_size_struct((const struct spoolss_StringArray *)r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic); >+} >+ > /* hand marshall as pidl cannot (yet) generate a relative pointer to a fixed array of > * structs */ > >diff --git a/librpc/ndr/ndr_spoolss_buf.h b/librpc/ndr/ndr_spoolss_buf.h >index aa6e277..9a76f82 100644 >--- a/librpc/ndr/ndr_spoolss_buf.h >+++ b/librpc/ndr/ndr_spoolss_buf.h >@@ -47,6 +47,7 @@ enum ndr_err_code ndr_pull_spoolss_GetPrinterData(struct ndr_pull *ndr, int flag > enum ndr_err_code ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterData *r); > uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, struct smb_iconv_convenience *ic, uint32_t flags); > size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, struct smb_iconv_convenience *ic, int flags); >+size_t ndr_size_spoolss_StringArray2(const struct spoolss_StringArray2 *r, struct smb_iconv_convenience *ic, int flags); > _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo101(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo101 *r); > _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo101(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo101 *r); > void ndr_print_spoolss_Field(struct ndr_print *ndr, const char *name, const union spoolss_Field *r); >-- >1.6.5.2 > > >From 8d5bfd58e67396a41766cda1ebc1297685594802 Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Wed, 2 Dec 2009 14:53:39 +0100 >Subject: [PATCH 4/6] samba-spoolss: use spoolss_StringArray2 in spoolss_EnumPrinterKey. > >This should finally resolve the endian issues we were seeing on sparc and is >much cleaner for spoolss clients and servers. > >Guenther >--- > librpc/gen_ndr/cli_spoolss.c | 4 +- > librpc/gen_ndr/cli_spoolss.h | 2 +- > librpc/gen_ndr/ndr_spoolss.c | 41 ++++++++-------------------------- > librpc/gen_ndr/spoolss.h | 2 +- > librpc/gen_ndr/srv_spoolss.c | 4 +- > librpc/idl/spoolss.idl | 2 +- > source3/rpc_client/cli_spoolss.c | 24 +++----------------- > source3/rpc_server/srv_spoolss_nt.c | 2 +- > source4/torture/rpc/spoolss.c | 19 ++------------- > source4/torture/rpc/spoolss_win.c | 19 ++------------- > 10 files changed, 28 insertions(+), 91 deletions(-) > >diff --git a/librpc/gen_ndr/cli_spoolss.c b/librpc/gen_ndr/cli_spoolss.c >index b605f58..244245d 100644 >--- a/librpc/gen_ndr/cli_spoolss.c >+++ b/librpc/gen_ndr/cli_spoolss.c >@@ -3811,7 +3811,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli, > TALLOC_CTX *mem_ctx, > struct policy_handle *handle /* [in] [ref] */, > const char *key_name /* [in] [charset(UTF16)] */, >- uint16_t *key_buffer /* [out] [ref,size_is(offered/2)] */, >+ struct spoolss_StringArray2 *key_buffer /* [out] [ref] */, > uint32_t offered /* [in] */, > uint32_t *needed /* [out] [ref] */, > WERROR *werror) >@@ -3847,7 +3847,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli, > } > > /* Return variables */ >- memcpy(key_buffer, r.out.key_buffer, (r.in.offered / 2) * sizeof(*key_buffer)); >+ *key_buffer = *r.out.key_buffer; > *needed = *r.out.needed; > > /* Return result */ >diff --git a/librpc/gen_ndr/cli_spoolss.h b/librpc/gen_ndr/cli_spoolss.h >index 4c621f4..f97bf9a 100644 >--- a/librpc/gen_ndr/cli_spoolss.h >+++ b/librpc/gen_ndr/cli_spoolss.h >@@ -497,7 +497,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli, > TALLOC_CTX *mem_ctx, > struct policy_handle *handle /* [in] [ref] */, > const char *key_name /* [in] [charset(UTF16)] */, >- uint16_t *key_buffer /* [out] [ref,size_is(offered/2)] */, >+ struct spoolss_StringArray2 *key_buffer /* [out] [ref] */, > uint32_t offered /* [in] */, > uint32_t *needed /* [out] [ref] */, > WERROR *werror); >diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c >index 0b67e80..a1d7f8f 100644 >--- a/librpc/gen_ndr/ndr_spoolss.c >+++ b/librpc/gen_ndr/ndr_spoolss.c >@@ -26672,7 +26672,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDataEx(struct ndr_print *ndr, const c > > _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterKey *r) > { >- uint32_t cntr_key_buffer_1; > if (flags & NDR_IN) { > if (r->in.handle == NULL) { > return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); >@@ -26688,10 +26687,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr, > if (r->out.key_buffer == NULL) { > return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); > } >- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered / 2)); >- for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.offered / 2; cntr_key_buffer_1++) { >- NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.key_buffer[cntr_key_buffer_1])); >- } >+ NDR_CHECK(ndr_push_spoolss_StringArray2(ndr, NDR_SCALARS, r->out.key_buffer)); > if (r->out.needed == NULL) { > return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer"); > } >@@ -26703,9 +26699,8 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr, > > _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterKey *r) > { >- uint32_t cntr_key_buffer_1; > TALLOC_CTX *_mem_save_handle_0; >- TALLOC_CTX *_mem_save_key_buffer_1; >+ TALLOC_CTX *_mem_save_key_buffer_0; > TALLOC_CTX *_mem_save_needed_0; > if (flags & NDR_IN) { > ZERO_STRUCT(r->out); >@@ -26725,22 +26720,19 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr, > NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t))); > NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.key_name, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t), CH_UTF16)); > NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered)); >- NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, r->in.offered / 2); >- memset(r->out.key_buffer, 0, (r->in.offered / 2) * sizeof(*r->out.key_buffer)); >+ NDR_PULL_ALLOC(ndr, r->out.key_buffer); >+ ZERO_STRUCTP(r->out.key_buffer); > NDR_PULL_ALLOC(ndr, r->out.needed); > ZERO_STRUCTP(r->out.needed); > } > if (flags & NDR_OUT) { >- NDR_CHECK(ndr_pull_array_size(ndr, &r->out.key_buffer)); > if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) { >- NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, ndr_get_array_size(ndr, &r->out.key_buffer)); >- } >- _mem_save_key_buffer_1 = NDR_PULL_GET_MEM_CTX(ndr); >- NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, 0); >- for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.offered / 2; cntr_key_buffer_1++) { >- NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.key_buffer[cntr_key_buffer_1])); >+ NDR_PULL_ALLOC(ndr, r->out.key_buffer); > } >- NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0); >+ _mem_save_key_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr); >+ NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, LIBNDR_FLAG_REF_ALLOC); >+ NDR_CHECK(ndr_pull_spoolss_StringArray2(ndr, NDR_SCALARS, r->out.key_buffer)); >+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0, LIBNDR_FLAG_REF_ALLOC); > if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) { > NDR_PULL_ALLOC(ndr, r->out.needed); > } >@@ -26749,16 +26741,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr, > NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed)); > NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC); > NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result)); >- if (r->out.key_buffer) { >- NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.key_buffer, r->in.offered / 2)); >- } > } > return NDR_ERR_SUCCESS; > } > > _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrinterKey *r) > { >- uint32_t cntr_key_buffer_1; > ndr_print_struct(ndr, name, "spoolss_EnumPrinterKey"); > ndr->depth++; > if (flags & NDR_SET_VALUES) { >@@ -26780,16 +26768,7 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char > ndr->depth++; > ndr_print_ptr(ndr, "key_buffer", r->out.key_buffer); > ndr->depth++; >- ndr->print(ndr, "%s: ARRAY(%d)", "key_buffer", (int)r->in.offered / 2); >- ndr->depth++; >- for (cntr_key_buffer_1=0;cntr_key_buffer_1<r->in.offered / 2;cntr_key_buffer_1++) { >- char *idx_1=NULL; >- if (asprintf(&idx_1, "[%d]", cntr_key_buffer_1) != -1) { >- ndr_print_uint16(ndr, "key_buffer", r->out.key_buffer[cntr_key_buffer_1]); >- free(idx_1); >- } >- } >- ndr->depth--; >+ ndr_print_spoolss_StringArray2(ndr, "key_buffer", r->out.key_buffer); > ndr->depth--; > ndr_print_ptr(ndr, "needed", r->out.needed); > ndr->depth++; >diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h >index 1d2cf5b..e7c125a 100644 >--- a/librpc/gen_ndr/spoolss.h >+++ b/librpc/gen_ndr/spoolss.h >@@ -3035,7 +3035,7 @@ struct spoolss_EnumPrinterKey { > } in; > > struct { >- uint16_t *key_buffer;/* [ref,size_is(offered/2)] */ >+ struct spoolss_StringArray2 *key_buffer;/* [ref] */ > uint32_t *needed;/* [ref] */ > WERROR result; > } out; >diff --git a/librpc/gen_ndr/srv_spoolss.c b/librpc/gen_ndr/srv_spoolss.c >index 3bbe401..2d12587 100644 >--- a/librpc/gen_ndr/srv_spoolss.c >+++ b/librpc/gen_ndr/srv_spoolss.c >@@ -6296,7 +6296,7 @@ static bool api_spoolss_EnumPrinterKey(pipes_struct *p) > } > > ZERO_STRUCT(r->out); >- r->out.key_buffer = talloc_zero_array(r, uint16_t, r->in.offered / 2); >+ r->out.key_buffer = talloc_zero(r, struct spoolss_StringArray2); > if (r->out.key_buffer == NULL) { > talloc_free(r); > return false; >@@ -8399,7 +8399,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, > case NDR_SPOOLSS_ENUMPRINTERKEY: { > struct spoolss_EnumPrinterKey *r = (struct spoolss_EnumPrinterKey *)_r; > ZERO_STRUCT(r->out); >- r->out.key_buffer = talloc_zero_array(mem_ctx, uint16_t, r->in.offered / 2); >+ r->out.key_buffer = talloc_zero(mem_ctx, struct spoolss_StringArray2); > if (r->out.key_buffer == NULL) { > return NT_STATUS_NO_MEMORY; > } >diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl >index cb34138..3d82dfa 100644 >--- a/librpc/idl/spoolss.idl >+++ b/librpc/idl/spoolss.idl >@@ -2307,7 +2307,7 @@ import "misc.idl", "security.idl", "winreg.idl"; > [public] WERROR spoolss_EnumPrinterKey( > [in, ref] policy_handle *handle, > [in] [string,charset(UTF16)] uint16 key_name[], >- [out,ref] [size_is(offered/2)] uint16 *key_buffer, >+ [out,ref] spoolss_StringArray2 *key_buffer, > [in] uint32 offered, > [out,ref] uint32 *needed > ); >diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c >index 5522ca7..d2e6556 100644 >--- a/source3/rpc_client/cli_spoolss.c >+++ b/source3/rpc_client/cli_spoolss.c >@@ -760,44 +760,28 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli, > NTSTATUS status; > WERROR werror; > uint32_t needed; >- uint16_t *buffer = NULL; >- >- *key_buffer = NULL; >- >- if (offered) { >- buffer = talloc_array(mem_ctx, uint16_t, offered/2); >- W_ERROR_HAVE_NO_MEMORY(buffer); >- } >+ struct spoolss_StringArray2 _key_buffer; > > status = rpccli_spoolss_EnumPrinterKey(cli, mem_ctx, > handle, > key_name, >- buffer, >+ &_key_buffer, > offered, > &needed, > &werror); > > if (W_ERROR_EQUAL(werror, WERR_MORE_DATA)) { > offered = needed; >- buffer = talloc_realloc(mem_ctx, buffer, uint16_t, needed/2); >- W_ERROR_HAVE_NO_MEMORY(buffer); > status = rpccli_spoolss_EnumPrinterKey(cli, mem_ctx, > handle, > key_name, >- buffer, >+ &_key_buffer, > offered, > &needed, > &werror); > } > >- if (W_ERROR_IS_OK(werror)) { >- const char **array; >- DATA_BLOB blob = data_blob_const((uint8_t *)buffer, offered); >- if (!pull_reg_multi_sz(mem_ctx, &blob, &array)) { >- return WERR_NOMEM; >- } >- *key_buffer = array; >- } >+ *key_buffer = _key_buffer.string; > > return werror; > } >diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c >index af0c952..1dfae32 100644 >--- a/source3/rpc_server/srv_spoolss_nt.c >+++ b/source3/rpc_server/srv_spoolss_nt.c >@@ -9317,7 +9317,7 @@ WERROR _spoolss_EnumPrinterKey(pipes_struct *p, > result = WERR_MORE_DATA; > } else { > result = WERR_OK; >- memcpy(r->out.key_buffer, blob.data, blob.length); >+ r->out.key_buffer->string = array; > } > > done: >diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c >index 895f6b9..6f9d7d2 100644 >--- a/source4/torture/rpc/spoolss.c >+++ b/source4/torture/rpc/spoolss.c >@@ -2006,44 +2006,31 @@ bool test_printer_keys(struct torture_context *tctx, > struct dcerpc_pipe *p, > struct policy_handle *handle) > { >- DATA_BLOB blob; > const char **key_array = NULL; > int i; > > { > struct spoolss_EnumPrinterKey r; > uint32_t needed; >- uint16_t *key_buffer = talloc_zero_array(tctx, uint16_t, 0); >+ struct spoolss_StringArray2 key_buffer; > > r.in.handle = handle; > r.in.key_name = ""; > r.in.offered = 0; >- r.out.key_buffer = key_buffer; >+ r.out.key_buffer = &key_buffer; > r.out.needed = &needed; > > torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r), > "failed to call EnumPrinterKey"); > if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { > r.in.offered = needed; >- key_buffer = talloc_zero_array(tctx, uint16_t, needed/2); >- r.out.key_buffer = key_buffer; > torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r), > "failed to call EnumPrinterKey"); > } > torture_assert_werr_ok(tctx, r.out.result, > "failed to call EnumPrinterKey"); > >- blob = data_blob_const(key_buffer, needed); >- } >- >- { >- union winreg_Data data; >- enum ndr_err_code ndr_err; >- ndr_err = ndr_pull_union_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), >- &data, REG_MULTI_SZ, >- (ndr_pull_flags_fn_t)ndr_pull_winreg_Data); >- torture_assert_ndr_success(tctx, ndr_err, "failed to pull REG_MULTI_SZ"); >- key_array = data.string_array; >+ key_array = key_buffer.string; > } > > for (i=0; key_array[i]; i++) { >diff --git a/source4/torture/rpc/spoolss_win.c b/source4/torture/rpc/spoolss_win.c >index df1a47d..5439d9d 100644 >--- a/source4/torture/rpc/spoolss_win.c >+++ b/source4/torture/rpc/spoolss_win.c >@@ -386,17 +386,15 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > NTSTATUS status; > struct spoolss_EnumPrinterKey epk; > uint32_t needed = 0; >- uint16_t *key_buffer; >+ struct spoolss_StringArray2 key_buffer; > > torture_comment(tctx, "Testing EnumPrinterKey(%s)\n", key); > >- key_buffer = talloc_zero_array(tctx, uint16_t, 0); >- > epk.in.handle = handle; > epk.in.key_name = talloc_strdup(tctx, key); > epk.in.offered = 0; > epk.out.needed = &needed; >- epk.out.key_buffer = key_buffer; >+ epk.out.key_buffer = &key_buffer; > > status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk); > torture_assert_ntstatus_ok(tctx, status, "EnumPrinterKey failed"); >@@ -404,8 +402,6 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > > if (W_ERROR_EQUAL(epk.out.result, WERR_MORE_DATA)) { > epk.in.offered = needed; >- key_buffer = talloc_zero_array(tctx, uint16_t, needed/2); >- epk.out.key_buffer = key_buffer; > status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk); > torture_assert_ntstatus_ok(tctx, status, > "EnumPrinterKey failed"); >@@ -413,16 +409,7 @@ static bool test_EnumPrinterKey(struct torture_context *tctx, > > torture_assert_werr_ok(tctx, epk.out.result, "EnumPrinterKey failed"); > >- { >- union winreg_Data data; >- enum ndr_err_code ndr_err; >- DATA_BLOB blob = data_blob_const(key_buffer, needed); >- ndr_err = ndr_pull_union_blob(&blob, tctx, lp_iconv_convenience(tctx->lp_ctx), >- &data, REG_MULTI_SZ, >- (ndr_pull_flags_fn_t)ndr_pull_winreg_Data); >- torture_assert_ndr_success(tctx, ndr_err, "failed to pull REG_MULTI_SZ"); >- ctx->printer_keys = data.string_array; >- } >+ ctx->printer_keys = key_buffer.string; > > return true; > } >-- >1.6.5.2 > > >From 5472c7b2b85d183cc3b8c689a4a0310a9462c33c Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Thu, 3 Dec 2009 23:23:36 +0100 >Subject: [PATCH 5/6] s3-spoolss: handle SEC_FLAG_MAXIMUM_ALLOWED in spoolss_OpenPrinterEx. > >In case someone (smbtorture4) requests SEC_FLAG_MAXIMUM_ALLOWED, translate it >to a request of PRINTER_ACCESS_ADMINISTER. > >Guenther >(cherry picked from commit 459a968fb4d6f96ea7f310f331d3547e2e466d6a) >--- > source3/rpc_server/srv_spoolss_nt.c | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > >diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c >index 1dfae32..ecad469 100644 >--- a/source3/rpc_server/srv_spoolss_nt.c >+++ b/source3/rpc_server/srv_spoolss_nt.c >@@ -1670,6 +1670,10 @@ WERROR _spoolss_OpenPrinterEx(pipes_struct *p, > return WERR_BADFID; > } > >+ if (r->in.access_mask == SEC_FLAG_MAXIMUM_ALLOWED) { >+ r->in.access_mask = PRINTER_ACCESS_ADMINISTER; >+ } >+ > se_map_standard(&r->in.access_mask, &printer_std_mapping); > > /* map an empty access mask to the minimum access mask */ >-- >1.6.5.2 > > >From c0b0e4337ce262d70290f7e72b7f97baa51c8241 Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd@samba.org> >Date: Wed, 2 Dec 2009 21:26:10 +0100 >Subject: [PATCH 6/6] spoolss: hand-marshall the spoolss_StringArray2 struct for spoolss_EnumPrinterKey. > >This call is just driving me nuts :-) > >Guenther >--- > librpc/gen_ndr/ndr_spoolss.c | 44 ------------------------------ > librpc/gen_ndr/spoolss.h | 2 +- > librpc/idl/spoolss.idl | 2 +- > librpc/ndr/ndr_spoolss_buf.c | 60 +++++++++++++++++++++++++++++++++++++++-- > librpc/ndr/ndr_spoolss_buf.h | 2 + > 5 files changed, 61 insertions(+), 49 deletions(-) > >diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c >index a1d7f8f..587819c 100644 >--- a/librpc/gen_ndr/ndr_spoolss.c >+++ b/librpc/gen_ndr/ndr_spoolss.c >@@ -7421,50 +7421,6 @@ _PUBLIC_ void ndr_print_spoolss_StringArray(struct ndr_print *ndr, const char *n > ndr->depth--; > } > >-_PUBLIC_ enum ndr_err_code ndr_push_spoolss_StringArray2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray2 *r) >-{ >- if (ndr_flags & NDR_SCALARS) { >- NDR_CHECK(ndr_push_align(ndr, 4)); >- NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2)); >- { >- uint32_t _flags_save_string_array = ndr->flags; >- ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >- { >- struct ndr_push *_ndr_string; >- NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_string, 0, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2 * 2)); >- NDR_CHECK(ndr_push_string_array(_ndr_string, NDR_SCALARS, r->string)); >- NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_string, 0, (ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags) - 4) / 2 * 2)); >- } >- ndr->flags = _flags_save_string_array; >- } >- } >- if (ndr_flags & NDR_BUFFERS) { >- } >- return NDR_ERR_SUCCESS; >-} >- >-_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_StringArray2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray2 *r) >-{ >- if (ndr_flags & NDR_SCALARS) { >- NDR_CHECK(ndr_pull_align(ndr, 4)); >- NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size)); >- { >- uint32_t _flags_save_string_array = ndr->flags; >- ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >- { >- struct ndr_pull *_ndr_string; >- NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_string, 0, r->_ndr_size * 2)); >- NDR_CHECK(ndr_pull_string_array(_ndr_string, NDR_SCALARS, &r->string)); >- NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_string, 0, r->_ndr_size * 2)); >- } >- ndr->flags = _flags_save_string_array; >- } >- } >- if (ndr_flags & NDR_BUFFERS) { >- } >- return NDR_ERR_SUCCESS; >-} >- > _PUBLIC_ void ndr_print_spoolss_StringArray2(struct ndr_print *ndr, const char *name, const struct spoolss_StringArray2 *r) > { > ndr_print_struct(ndr, name, "spoolss_StringArray2"); >diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h >index e7c125a..f70438d 100644 >--- a/librpc/gen_ndr/spoolss.h >+++ b/librpc/gen_ndr/spoolss.h >@@ -726,7 +726,7 @@ struct spoolss_StringArray { > struct spoolss_StringArray2 { > uint32_t _ndr_size;/* [value((ndr_size_spoolss_StringArray2(r,ndr->iconv_convenience,ndr->flags)-4)/2)] */ > const char ** string;/* [subcontext_size(_ndr_size*2),subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */ >-}/* [public] */; >+}/* [nopush,public,nopull] */; > > struct spoolss_AddDriverInfo1 { > const char *driver_name;/* [unique,charset(UTF16)] */ >diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl >index 3d82dfa..2e47eb6 100644 >--- a/librpc/idl/spoolss.idl >+++ b/librpc/idl/spoolss.idl >@@ -786,7 +786,7 @@ import "misc.idl", "security.idl", "winreg.idl"; > /*[subcontext(0),subcontext_size(_ndr_size*2)]*/ nstring_array string; > } spoolss_StringArray; > >- typedef [public] struct { >+ typedef [public,nopush,nopull] struct { > [value((ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags)-4)/2)] uint32 _ndr_size; > [subcontext(0),subcontext_size(_ndr_size*2)] nstring_array string; > } spoolss_StringArray2; >diff --git a/librpc/ndr/ndr_spoolss_buf.c b/librpc/ndr/ndr_spoolss_buf.c >index 9968e90..0527197 100644 >--- a/librpc/ndr/ndr_spoolss_buf.c >+++ b/librpc/ndr/ndr_spoolss_buf.c >@@ -708,13 +708,67 @@ _PUBLIC_ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r > return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic); > } > >+_PUBLIC_ enum ndr_err_code ndr_push_spoolss_StringArray2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray2 *r) >+{ >+ if (ndr_flags & NDR_SCALARS) { >+ uint32_t _ndr_size; >+ _ndr_size = ndr_size_spoolss_StringArray2(r, ndr->iconv_convenience, ndr->flags); >+ NDR_CHECK(ndr_push_align(ndr, 4)); >+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, _ndr_size)); >+ if (_ndr_size > 0) { >+ uint32_t _flags_save_string_array = ndr->flags; >+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >+ { >+ struct ndr_push *_ndr_string; >+ NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_string, 0, _ndr_size * 2)); >+ NDR_CHECK(ndr_push_string_array(_ndr_string, NDR_SCALARS, r->string)); >+ NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_string, 0, _ndr_size * 2)); >+ } >+ ndr->flags = _flags_save_string_array; >+ } >+ } >+ if (ndr_flags & NDR_BUFFERS) { >+ } >+ return NDR_ERR_SUCCESS; >+} >+ > _PUBLIC_ size_t ndr_size_spoolss_StringArray2(const struct spoolss_StringArray2 *r, struct smb_iconv_convenience *ic, int flags) > { >- if (!r) { >- return 4; >+ uint32_t i; >+ >+ if (!r || !r->string) { >+ return 0; > } > >- return ndr_size_struct((const struct spoolss_StringArray *)r, flags, (ndr_push_flags_fn_t)ndr_push_spoolss_StringArray, ic); >+ for (i=0; r->string[i]; i++) { >+ ;; >+ } >+ >+ return (ndr_size_string_array(r->string, i, LIBNDR_FLAG_STR_NULLTERM) + 1); >+} >+ >+_PUBLIC_ enum ndr_err_code ndr_pull_spoolss_StringArray2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray2 *r) >+{ >+ if (ndr_flags & NDR_SCALARS) { >+ NDR_CHECK(ndr_pull_align(ndr, 4)); >+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->_ndr_size)); >+ if (r->_ndr_size) { >+ uint32_t _flags_save_string_array = ndr->flags; >+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM); >+ { >+ struct ndr_pull *_ndr_string; >+ NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_string, 0, r->_ndr_size * 2)); >+ NDR_CHECK(ndr_pull_string_array(_ndr_string, NDR_SCALARS, &r->string)); >+ NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_string, 0, r->_ndr_size * 2)); >+ } >+ ndr->flags = _flags_save_string_array; >+ } else { >+ r->string = NULL; >+ } >+ } >+ if (ndr_flags & NDR_BUFFERS) { >+ } >+ return NDR_ERR_SUCCESS; > } > > /* hand marshall as pidl cannot (yet) generate a relative pointer to a fixed array of >diff --git a/librpc/ndr/ndr_spoolss_buf.h b/librpc/ndr/ndr_spoolss_buf.h >index 9a76f82..74d0b52 100644 >--- a/librpc/ndr/ndr_spoolss_buf.h >+++ b/librpc/ndr/ndr_spoolss_buf.h >@@ -47,6 +47,8 @@ enum ndr_err_code ndr_pull_spoolss_GetPrinterData(struct ndr_pull *ndr, int flag > enum ndr_err_code ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const struct spoolss_SetPrinterData *r); > uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, struct smb_iconv_convenience *ic, uint32_t flags); > size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, struct smb_iconv_convenience *ic, int flags); >+enum ndr_err_code ndr_push_spoolss_StringArray2(struct ndr_push *ndr, int ndr_flags, const struct spoolss_StringArray2 *r); >+enum ndr_err_code ndr_pull_spoolss_StringArray2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_StringArray2 *r); > size_t ndr_size_spoolss_StringArray2(const struct spoolss_StringArray2 *r, struct smb_iconv_convenience *ic, int flags); > _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo101(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo101 *r); > _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo101(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo101 *r); >-- >1.6.5.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 6883
:
4938
|
4980
|
4992
|
5003
|
5026
|
5068
|
5082