[SCM] Samba Shared Repository - branch v3-4-test updated

Karolin Seeger kseeger at samba.org
Mon Nov 30 08:10:43 MST 2009


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 <gd at samba.org>
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 <gd at samba.org>
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 <gd at samba.org>
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 <gd at samba.org>
Date:   Fri Nov 20 12:57:13 2009 +0100

    spoolss: fix spoolss_EnumPrinterKey IDL.
    
    Guenther

commit 560b7a45ff8257b7d9994199218edfa3ea4e8dae
Author: Günther Deschner <gd at samba.org>
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 <gd at samba.org>
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 <gd at samba.org>
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 <gd at samba.org>
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


More information about the samba-cvs mailing list