The branch, master has been updated
       via  9a3d9ab... s3-selftest: run LOCAL-NDR when running make selftest.
       via  450211b... s4-smbtorture: be very strict in checking 
spools_EnumPrinterKey results.
       via  f32ccc3... spoolss: hand-marshall the spoolss_StringArray2 struct 
for spoolss_EnumPrinterKey.
      from  8d7a43f... s4-drs: fixed UDV and overlapping sync calls in DRS

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9a3d9abdd8e9737245e3cdd7f31d453c2062dba9
Author: Günther Deschner <g...@samba.org>
Date:   Thu Dec 3 00:46:47 2009 +0100

    s3-selftest: run LOCAL-NDR when running make selftest.
    
    Guenther

commit 450211b61016a4fed71eb116c1b526af0f365f13
Author: Günther Deschner <g...@samba.org>
Date:   Wed Dec 2 23:38:05 2009 +0100

    s4-smbtorture: be very strict in checking spools_EnumPrinterKey results.
    
    Guenther

commit f32ccc321a5467401781a0e2d4621175b6256368
Author: Günther Deschner <g...@samba.org>
Date:   Wed Dec 2 21:26:10 2009 +0100

    spoolss: hand-marshall the spoolss_StringArray2 struct for 
spoolss_EnumPrinterKey.
    
    This call is just driving me nuts :-)
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c          |   46 ------------------------
 librpc/gen_ndr/spoolss.h              |    2 +-
 librpc/idl/spoolss.idl                |    2 +-
 librpc/ndr/ndr_spoolss_buf.c          |   62 +++++++++++++++++++++++++++++++--
 librpc/ndr/ndr_spoolss_buf.h          |    2 +
 source3/script/tests/test_posix_s3.sh |    2 +-
 source4/torture/rpc/spoolss.c         |    9 ++++-
 source4/torture/rpc/spoolss_win.c     |    9 ++++-
 8 files changed, 79 insertions(+), 55 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 41d07d1..f783a83 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -8125,52 +8125,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;
-               }
-               NDR_CHECK(ndr_push_trailer_align(ndr, 4));
-       }
-       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;
-               }
-               NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
-       }
-       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 8b9a1ee..e209cb4 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -1209,7 +1209,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 3ae1685..154a4ef 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -980,7 +980,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..4965b5d 100644
--- a/librpc/ndr/ndr_spoolss_buf.c
+++ b/librpc/ndr/ndr_spoolss_buf.c
@@ -708,13 +708,69 @@ _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;
+               }
+               NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+       }
+       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;
+               }
+               NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+       }
+       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);
diff --git a/source3/script/tests/test_posix_s3.sh 
b/source3/script/tests/test_posix_s3.sh
index d54cf7b..07d2873 100755
--- a/source3/script/tests/test_posix_s3.sh
+++ b/source3/script/tests/test_posix_s3.sh
@@ -48,7 +48,7 @@ rpc="$rpc RPC-SAMR-PASSWORDS-PWDLASTSET RPC-SAMR-LARGE-DC 
RPC-SAMR-MACHINE-AUTH"
 rpc="$rpc RPC-NETLOGON-S3 RPC-NETLOGON-ADMIN"
 rpc="$rpc RPC-SCHANNEL RPC-SCHANNEL2 RPC-BENCH-SCHANNEL1 RPC-JOIN"
 
-local="LOCAL-NSS-WRAPPER"
+local="LOCAL-NSS-WRAPPER LOCAL-NDR"
 
 winbind="WINBIND-WBCLIENT"
 
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index e341b71..bd5c455 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -3060,6 +3060,9 @@ bool test_printer_keys(struct torture_context *tctx,
                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)) {
+                       torture_assert(tctx, (key_buffer._ndr_size == 0),
+                               talloc_asprintf(tctx, "EnumPrinterKey did not 
return 0 _ndr_size (but %d), windows clients would abort here!", 
key_buffer._ndr_size));
+
                        r.in.offered = needed;
                        torture_assert_ntstatus_ok(tctx, 
dcerpc_spoolss_EnumPrinterKey(p, tctx, &r),
                                "failed to call EnumPrinterKey");
@@ -3067,10 +3070,14 @@ bool test_printer_keys(struct torture_context *tctx,
                torture_assert_werr_ok(tctx, r.out.result,
                        "failed to call EnumPrinterKey");
 
+               torture_assert(tctx, (key_buffer._ndr_size * 2 == needed),
+                       talloc_asprintf(tctx, "EnumPrinterKey size mismatch, 
_ndr_size %d (expected %d)",
+                       key_buffer._ndr_size, needed/2));
+
                key_array = key_buffer.string;
        }
 
-       for (i=0; key_array[i]; i++) {
+       for (i=0; key_array && key_array[i]; i++) {
                struct spoolss_EnumPrinterDataEx r;
                uint32_t count;
                struct spoolss_PrinterEnumValues *info;
diff --git a/source4/torture/rpc/spoolss_win.c 
b/source4/torture/rpc/spoolss_win.c
index d2851cf..8856729 100644
--- a/source4/torture/rpc/spoolss_win.c
+++ b/source4/torture/rpc/spoolss_win.c
@@ -397,8 +397,9 @@ static bool test_EnumPrinterKey(struct torture_context 
*tctx,
        status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk);
        torture_assert_ntstatus_ok(tctx, status, "EnumPrinterKey failed");
 
-
        if (W_ERROR_EQUAL(epk.out.result, WERR_MORE_DATA)) {
+               torture_assert(tctx, (key_buffer._ndr_size == 0),
+                       talloc_asprintf(tctx, "EnumPrinterKey did not return 0 
_ndr_size (but %d), windows clients would abort here!", key_buffer._ndr_size));
                epk.in.offered = needed;
                status = dcerpc_spoolss_EnumPrinterKey(p, tctx, &epk);
                torture_assert_ntstatus_ok(tctx, status,
@@ -407,6 +408,10 @@ static bool test_EnumPrinterKey(struct torture_context 
*tctx,
 
        torture_assert_werr_ok(tctx, epk.out.result, "EnumPrinterKey failed");
 
+       torture_assert(tctx, (key_buffer._ndr_size * 2 == needed),
+               talloc_asprintf(tctx, "EnumPrinterKey size mismatch, _ndr_size 
%d (expected %d)",
+               key_buffer._ndr_size, needed/2));
+
        ctx->printer_keys = key_buffer.string;
 
        return true;
@@ -550,7 +555,7 @@ static bool test_WinXP(struct torture_context *tctx, struct 
dcerpc_pipe *p)
 
        ret &= test_EnumPrinterKey(tctx, p, &handle03, "", ctx);
 
-       for (i=0; ctx->printer_keys[i] != NULL; i++) {
+       for (i=0; ctx->printer_keys && ctx->printer_keys[i] != NULL; i++) {
 
                ret &= test_EnumPrinterKey(tctx, p, &handle03,
                                           ctx->printer_keys[i],


-- 
Samba Shared Repository

Reply via email to