The branch, v3-4-test has been updated
via ab9e7e9... s3-spoolss: simplify _spoolss_EnumPrinterKey a little
more.
via 29c22e1... s3-spoolss: fixes for _spoolss_EnumPrinterKey client and
server.
via 5b86641... s3-spoolss: fix spoolss_EnumPrinterKey client and server
code.
via 167a9ea... spoolss: fix spoolss_EnumPrinterKey IDL.
via 560b7a4... s3-util: add pull_reg_sz() and pull_reg_multi_sz()
convenience functions.
via 20b4320... s3-util: add push_reg_sz() and push_reg_multi_sz()
convenience functions.
via 09d1d63... misc: mark winreg_Data little-endian except for a
REG_DWORD_BIG_ENDIAN.
via a15f3cb... winreg: add winreg_Data union to IDL.
from 2004627... s3-kerberos: fix the build on Mac OS X 10.6.2.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test
- Log -----------------------------------------------------------------
commit ab9e7e9ac813f4bbadf1ebf86dfaac2f47e75de2
Author: Günther Deschner <[email protected]>
Date: Thu Nov 26 19:01:54 2009 +0100
s3-spoolss: simplify _spoolss_EnumPrinterKey a little more.
Guenther
(cherry picked from commit e512ccb5b677fa7f285829ec645fc067837c0e11)
Part of a fix for bug #6883 (Add Printer fails with 0x000006f7 on Windows
7).
commit 29c22e159352bcb334dfb7c5846e865967d77cb0
Author: Günther Deschner <[email protected]>
Date: Tue Nov 24 15:22:04 2009 +0100
s3-spoolss: fixes for _spoolss_EnumPrinterKey client and server.
Thanks Metze for review!
Guenther
(cherry picked from commit 846aa18648f3b34ab5cbc4dc4ba334bbedeab2f4)
commit 5b86641b5003379208d8d55f2d6eac6aac6e1488
Author: Günther Deschner <[email protected]>
Date: Fri Nov 20 16:34:00 2009 +0100
s3-spoolss: fix spoolss_EnumPrinterKey client and server code.
Guenther
(cherry picked from commit d464151f3b47c675664f464b1645ca85de663655)
commit 167a9ea770a38ffbe121da522bfdab79aa60413d
Author: Günther Deschner <[email protected]>
Date: Fri Nov 20 12:57:13 2009 +0100
spoolss: fix spoolss_EnumPrinterKey IDL.
Guenther
commit 560b7a45ff8257b7d9994199218edfa3ea4e8dae
Author: Günther Deschner <[email protected]>
Date: Fri Sep 25 00:56:17 2009 +0200
s3-util: add pull_reg_sz() and pull_reg_multi_sz() convenience functions.
Guenther
(cherry picked from commit f8016cfee922cba97b70f56c752827e4584da6c6)
commit 20b43200885d7e4cef5e26ad249c9a4c6529dca5
Author: Günther Deschner <[email protected]>
Date: Wed Sep 23 20:42:20 2009 +0200
s3-util: add push_reg_sz() and push_reg_multi_sz() convenience functions.
Guenther
(cherry picked from commit fcee9d2c97a673347baf58f749f35785a896e468)
commit 09d1d639da808b94c25749423675925fbe3b3660
Author: Günther Deschner <[email protected]>
Date: Fri Nov 27 11:18:30 2009 +0100
misc: mark winreg_Data little-endian except for a REG_DWORD_BIG_ENDIAN.
Guenther
commit a15f3cb7c72eebecce48db83e045739f771ab4d7
Author: Günther Deschner <[email protected]>
Date: Wed Sep 23 20:41:44 2009 +0200
winreg: add winreg_Data union to IDL.
Guenther
-----------------------------------------------------------------------
Summary of changes:
librpc/gen_ndr/cli_spoolss.c | 4 +-
librpc/gen_ndr/cli_spoolss.h | 2 +-
librpc/gen_ndr/misc.h | 41 +++++
librpc/gen_ndr/ndr_misc.c | 290 +++++++++++++++++++++++++++++++++++
librpc/gen_ndr/ndr_misc.h | 6 +
librpc/gen_ndr/ndr_spoolss.c | 80 ++++------
librpc/gen_ndr/ndr_winreg.c | 36 +-----
librpc/gen_ndr/ndr_winreg.h | 3 -
librpc/gen_ndr/spoolss.h | 2 +-
librpc/gen_ndr/srv_spoolss.c | 4 +-
librpc/gen_ndr/winreg.h | 34 +----
librpc/idl/misc.idl | 28 ++++
librpc/idl/spoolss.idl | 2 +-
librpc/idl/winreg.idl | 17 +--
source3/include/proto.h | 4 +
source3/lib/util_reg.c | 65 ++++++++
source3/rpc_client/cli_spoolss.c | 24 +++-
source3/rpc_server/srv_spoolss_nt.c | 27 ++--
18 files changed, 512 insertions(+), 157 deletions(-)
Changeset truncated at 500 lines:
diff --git a/librpc/gen_ndr/cli_spoolss.c b/librpc/gen_ndr/cli_spoolss.c
index 3dd73c6..b605f58 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)] */,
- const char ** *key_buffer /* [out]
[subcontext_size(offered),ref,subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */,
+ uint16_t *key_buffer /* [out]
[ref,size_is(offered/2)] */,
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 */
- *key_buffer = *r.out.key_buffer;
+ memcpy(key_buffer, r.out.key_buffer, (r.in.offered / 2) *
sizeof(*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 eb86e8c..4c621f4 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)] */,
- const char ** *key_buffer /* [out]
[subcontext_size(offered),ref,subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */,
+ uint16_t *key_buffer /* [out]
[ref,size_is(offered/2)] */,
uint32_t offered /* [in] */,
uint32_t *needed /* [out] [ref] */,
WERROR *werror);
diff --git a/librpc/gen_ndr/misc.h b/librpc/gen_ndr/misc.h
index 824483d..e3851ce 100644
--- a/librpc/gen_ndr/misc.h
+++ b/librpc/gen_ndr/misc.h
@@ -50,4 +50,45 @@ struct KRB5_EDATA_NTSTATUS {
uint32_t unknown2;
}/* [public] */;
+enum winreg_Type
+#ifndef USE_UINT_ENUMS
+ {
+ REG_NONE=0,
+ REG_SZ=1,
+ REG_EXPAND_SZ=2,
+ REG_BINARY=3,
+ REG_DWORD=4,
+ REG_DWORD_BIG_ENDIAN=5,
+ REG_LINK=6,
+ REG_MULTI_SZ=7,
+ REG_RESOURCE_LIST=8,
+ REG_FULL_RESOURCE_DESCRIPTOR=9,
+ REG_RESOURCE_REQUIREMENTS_LIST=10,
+ REG_QWORD=11
+}
+#else
+ { __donnot_use_enum_winreg_Type=0x7FFFFFFF}
+#define REG_NONE ( 0 )
+#define REG_SZ ( 1 )
+#define REG_EXPAND_SZ ( 2 )
+#define REG_BINARY ( 3 )
+#define REG_DWORD ( 4 )
+#define REG_DWORD_BIG_ENDIAN ( 5 )
+#define REG_LINK ( 6 )
+#define REG_MULTI_SZ ( 7 )
+#define REG_RESOURCE_LIST ( 8 )
+#define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )
+#define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
+#define REG_QWORD ( 11 )
+#endif
+;
+
+union winreg_Data {
+ const char * string;/* [flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_SZ)] */
+ DATA_BLOB binary;/* [flag(LIBNDR_FLAG_REMAINING),case(REG_BINARY)] */
+ uint32_t value;/* [case(REG_DWORD)] */
+ const char ** string_array;/*
[flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_MULTI_SZ)] */
+ DATA_BLOB data;/* [flag(LIBNDR_FLAG_REMAINING),default] */
+}/* [public,nodiscriminant,flag(LIBNDR_FLAG_LITTLE_ENDIAN)] */;
+
#endif /* _HEADER_misc */
diff --git a/librpc/gen_ndr/ndr_misc.c b/librpc/gen_ndr/ndr_misc.c
index 28c8560..45872d6 100644
--- a/librpc/gen_ndr/ndr_misc.c
+++ b/librpc/gen_ndr/ndr_misc.c
@@ -168,3 +168,293 @@ _PUBLIC_ void ndr_print_KRB5_EDATA_NTSTATUS(struct
ndr_print *ndr, const char *n
ndr->depth--;
}
+_PUBLIC_ enum ndr_err_code ndr_push_winreg_Type(struct ndr_push *ndr, int
ndr_flags, enum winreg_Type r)
+{
+ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+ return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_winreg_Type(struct ndr_pull *ndr, int
ndr_flags, enum winreg_Type *r)
+{
+ uint32_t v;
+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+ *r = v;
+ return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_winreg_Type(struct ndr_print *ndr, const char *name,
enum winreg_Type r)
+{
+ const char *val = NULL;
+
+ switch (r) {
+ case REG_NONE: val = "REG_NONE"; break;
+ case REG_SZ: val = "REG_SZ"; break;
+ case REG_EXPAND_SZ: val = "REG_EXPAND_SZ"; break;
+ case REG_BINARY: val = "REG_BINARY"; break;
+ case REG_DWORD: val = "REG_DWORD"; break;
+ case REG_DWORD_BIG_ENDIAN: val = "REG_DWORD_BIG_ENDIAN"; break;
+ case REG_LINK: val = "REG_LINK"; break;
+ case REG_MULTI_SZ: val = "REG_MULTI_SZ"; break;
+ case REG_RESOURCE_LIST: val = "REG_RESOURCE_LIST"; break;
+ case REG_FULL_RESOURCE_DESCRIPTOR: val =
"REG_FULL_RESOURCE_DESCRIPTOR"; break;
+ case REG_RESOURCE_REQUIREMENTS_LIST: val =
"REG_RESOURCE_REQUIREMENTS_LIST"; break;
+ case REG_QWORD: val = "REG_QWORD"; break;
+ }
+ ndr_print_enum(ndr, name, "ENUM", val, r);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int
ndr_flags, const union winreg_Data *r)
+{
+ {
+ uint32_t _flags_save_UNION = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+ if (ndr_flags & NDR_SCALARS) {
+ int level = ndr_push_get_switch_value(ndr, r);
+ switch (level) {
+ case REG_NONE: {
+ break; }
+
+ case REG_SZ: {
+ {
+ uint32_t _flags_save_string =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_push_string(ndr,
NDR_SCALARS, r->string));
+ ndr->flags = _flags_save_string;
+ }
+ break; }
+
+ case REG_EXPAND_SZ: {
+ {
+ uint32_t _flags_save_string =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_push_string(ndr,
NDR_SCALARS, r->string));
+ ndr->flags = _flags_save_string;
+ }
+ break; }
+
+ case REG_BINARY: {
+ {
+ uint32_t _flags_save_DATA_BLOB
= ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_REMAINING);
+
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->binary));
+ ndr->flags =
_flags_save_DATA_BLOB;
+ }
+ break; }
+
+ case REG_DWORD: {
+ NDR_CHECK(ndr_push_uint32(ndr,
NDR_SCALARS, r->value));
+ break; }
+
+ case REG_DWORD_BIG_ENDIAN: {
+ {
+ uint32_t _flags_save_uint32 =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_BIGENDIAN);
+ NDR_CHECK(ndr_push_uint32(ndr,
NDR_SCALARS, r->value));
+ ndr->flags = _flags_save_uint32;
+ }
+ break; }
+
+ case REG_MULTI_SZ: {
+ {
+ uint32_t
_flags_save_string_array = ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+
NDR_CHECK(ndr_push_string_array(ndr, NDR_SCALARS, r->string_array));
+ ndr->flags =
_flags_save_string_array;
+ }
+ break; }
+
+ default: {
+ {
+ uint32_t _flags_save_DATA_BLOB
= ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_REMAINING);
+
NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, r->data));
+ ndr->flags =
_flags_save_DATA_BLOB;
+ }
+ break; }
+
+ }
+ }
+ if (ndr_flags & NDR_BUFFERS) {
+ int level = ndr_push_get_switch_value(ndr, r);
+ switch (level) {
+ case REG_NONE:
+ break;
+
+ case REG_SZ:
+ break;
+
+ case REG_EXPAND_SZ:
+ break;
+
+ case REG_BINARY:
+ break;
+
+ case REG_DWORD:
+ break;
+
+ case REG_DWORD_BIG_ENDIAN:
+ break;
+
+ case REG_MULTI_SZ:
+ break;
+
+ default:
+ break;
+
+ }
+ }
+ ndr->flags = _flags_save_UNION;
+ }
+ return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int
ndr_flags, union winreg_Data *r)
+{
+ int level;
+ {
+ uint32_t _flags_save_UNION = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+ level = ndr_pull_get_switch_value(ndr, r);
+ if (ndr_flags & NDR_SCALARS) {
+ switch (level) {
+ case REG_NONE: {
+ break; }
+
+ case REG_SZ: {
+ {
+ uint32_t _flags_save_string =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_pull_string(ndr,
NDR_SCALARS, &r->string));
+ ndr->flags = _flags_save_string;
+ }
+ break; }
+
+ case REG_EXPAND_SZ: {
+ {
+ uint32_t _flags_save_string =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+ NDR_CHECK(ndr_pull_string(ndr,
NDR_SCALARS, &r->string));
+ ndr->flags = _flags_save_string;
+ }
+ break; }
+
+ case REG_BINARY: {
+ {
+ uint32_t _flags_save_DATA_BLOB
= ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_REMAINING);
+
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->binary));
+ ndr->flags =
_flags_save_DATA_BLOB;
+ }
+ break; }
+
+ case REG_DWORD: {
+ NDR_CHECK(ndr_pull_uint32(ndr,
NDR_SCALARS, &r->value));
+ break; }
+
+ case REG_DWORD_BIG_ENDIAN: {
+ {
+ uint32_t _flags_save_uint32 =
ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_BIGENDIAN);
+ NDR_CHECK(ndr_pull_uint32(ndr,
NDR_SCALARS, &r->value));
+ ndr->flags = _flags_save_uint32;
+ }
+ break; }
+
+ case REG_MULTI_SZ: {
+ {
+ uint32_t
_flags_save_string_array = ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_STR_NULLTERM);
+
NDR_CHECK(ndr_pull_string_array(ndr, NDR_SCALARS, &r->string_array));
+ ndr->flags =
_flags_save_string_array;
+ }
+ break; }
+
+ default: {
+ {
+ uint32_t _flags_save_DATA_BLOB
= ndr->flags;
+ ndr_set_flags(&ndr->flags,
LIBNDR_FLAG_REMAINING);
+
NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, &r->data));
+ ndr->flags =
_flags_save_DATA_BLOB;
+ }
+ break; }
+
+ }
+ }
+ if (ndr_flags & NDR_BUFFERS) {
+ switch (level) {
+ case REG_NONE:
+ break;
+
+ case REG_SZ:
+ break;
+
+ case REG_EXPAND_SZ:
+ break;
+
+ case REG_BINARY:
+ break;
+
+ case REG_DWORD:
+ break;
+
+ case REG_DWORD_BIG_ENDIAN:
+ break;
+
+ case REG_MULTI_SZ:
+ break;
+
+ default:
+ break;
+
+ }
+ }
+ ndr->flags = _flags_save_UNION;
+ }
+ return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name,
const union winreg_Data *r)
+{
+ int level;
+ {
+ uint32_t _flags_save_UNION = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_LITTLE_ENDIAN);
+ level = ndr_print_get_switch_value(ndr, r);
+ ndr_print_union(ndr, name, level, "winreg_Data");
+ switch (level) {
+ case REG_NONE:
+ break;
+
+ case REG_SZ:
+ ndr_print_string(ndr, "string", r->string);
+ break;
+
+ case REG_EXPAND_SZ:
+ ndr_print_string(ndr, "string", r->string);
+ break;
+
+ case REG_BINARY:
+ ndr_print_DATA_BLOB(ndr, "binary", r->binary);
+ break;
+
+ case REG_DWORD:
+ ndr_print_uint32(ndr, "value", r->value);
+ break;
+
+ case REG_DWORD_BIG_ENDIAN:
+ ndr_print_uint32(ndr, "value", r->value);
+ break;
+
+ case REG_MULTI_SZ:
+ ndr_print_string_array(ndr, "string_array",
r->string_array);
+ break;
+
+ default:
+ ndr_print_DATA_BLOB(ndr, "data", r->data);
+ break;
+
+ }
+ ndr->flags = _flags_save_UNION;
+ }
+}
+
diff --git a/librpc/gen_ndr/ndr_misc.h b/librpc/gen_ndr/ndr_misc.h
index 938c946..99f9752 100644
--- a/librpc/gen_ndr/ndr_misc.h
+++ b/librpc/gen_ndr/ndr_misc.h
@@ -23,4 +23,10 @@ void ndr_print_netr_SchannelType(struct ndr_print *ndr,
const char *name, enum n
enum ndr_err_code ndr_push_KRB5_EDATA_NTSTATUS(struct ndr_push *ndr, int
ndr_flags, const struct KRB5_EDATA_NTSTATUS *r);
enum ndr_err_code ndr_pull_KRB5_EDATA_NTSTATUS(struct ndr_pull *ndr, int
ndr_flags, struct KRB5_EDATA_NTSTATUS *r);
void ndr_print_KRB5_EDATA_NTSTATUS(struct ndr_print *ndr, const char *name,
const struct KRB5_EDATA_NTSTATUS *r);
+enum ndr_err_code ndr_push_winreg_Type(struct ndr_push *ndr, int ndr_flags,
enum winreg_Type r);
+enum ndr_err_code ndr_pull_winreg_Type(struct ndr_pull *ndr, int ndr_flags,
enum winreg_Type *r);
+void ndr_print_winreg_Type(struct ndr_print *ndr, const char *name, enum
winreg_Type r);
+enum ndr_err_code ndr_push_winreg_Data(struct ndr_push *ndr, int ndr_flags,
const union winreg_Data *r);
+enum ndr_err_code ndr_pull_winreg_Data(struct ndr_pull *ndr, int ndr_flags,
union winreg_Data *r);
+void ndr_print_winreg_Data(struct ndr_print *ndr, const char *name, const
union winreg_Data *r);
#endif /* _HEADER_NDR_misc */
diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index d4195e4..d03196e 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -26619,6 +26619,7 @@ _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");
@@ -26631,22 +26632,12 @@ _PUBLIC_ enum ndr_err_code
ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
}
if (flags & NDR_OUT) {
- {
- uint32_t _flags_save_string_array = ndr->flags;
- ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
- if (r->out.key_buffer == NULL) {
- return ndr_push_error(ndr,
NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
- }
- NDR_CHECK(ndr_push_unique_ptr(ndr, *r->out.key_buffer));
- if (*r->out.key_buffer) {
- {
- struct ndr_push *_ndr_key_buffer;
-
NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
-
NDR_CHECK(ndr_push_string_array(_ndr_key_buffer, NDR_SCALARS,
*r->out.key_buffer));
- NDR_CHECK(ndr_push_subcontext_end(ndr,
_ndr_key_buffer, 0, r->in.offered));
- }
- }
- ndr->flags = _flags_save_string_array;
+ 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]));
}
if (r->out.needed == NULL) {
return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER,
"NULL [ref] pointer");
@@ -26659,9 +26650,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 _ptr_key_buffer;
+ uint32_t cntr_key_buffer_1;
TALLOC_CTX *_mem_save_handle_0;
- TALLOC_CTX *_mem_save_key_buffer_0;
TALLOC_CTX *_mem_save_key_buffer_1;
TALLOC_CTX *_mem_save_needed_0;
if (flags & NDR_IN) {
@@ -26682,40 +26672,22 @@ _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(ndr, r->out.key_buffer);
- ZERO_STRUCTP(r->out.key_buffer);
+ 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.needed);
ZERO_STRUCTP(r->out.needed);
}
if (flags & NDR_OUT) {
- {
- uint32_t _flags_save_string_array = ndr->flags;
- ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
- if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
- NDR_PULL_ALLOC(ndr, r->out.key_buffer);
- }
- _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_generic_ptr(ndr, &_ptr_key_buffer));
- if (_ptr_key_buffer) {
- NDR_PULL_ALLOC(ndr, *r->out.key_buffer);
- } else {
- *r->out.key_buffer = NULL;
- }
- if (*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);
- {
- struct ndr_pull *_ndr_key_buffer;
-
NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
-
NDR_CHECK(ndr_pull_string_array(_ndr_key_buffer, NDR_SCALARS,
r->out.key_buffer));
- NDR_CHECK(ndr_pull_subcontext_end(ndr,
_ndr_key_buffer, 0, r->in.offered));
- }
- NDR_PULL_SET_MEM_CTX(ndr,
_mem_save_key_buffer_1, 0);
- }
- NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0,
LIBNDR_FLAG_REF_ALLOC);
- ndr->flags = _flags_save_string_array;
+ 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_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0);
if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
--
Samba Shared Repository