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

Reply via email to