The branch, master has been updated
       via  f167c977d12e88fce3ac15a25c24ca5d1157a883 (commit)
       via  92791ce9a8439ac06a22afdbeb0d0fc66c32cb31 (commit)
       via  7ccc9a6ef563cc855752b4e74152420b9be5af43 (commit)
      from  b7c003c09c06ef5a23beb0928affaba75f65587c (commit)

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


- Log -----------------------------------------------------------------
commit f167c977d12e88fce3ac15a25c24ca5d1157a883
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Jul 27 17:35:54 2009 +0200

    librpc: rerun "make idl_full"
    
    metze

commit 92791ce9a8439ac06a22afdbeb0d0fc66c32cb31
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Jul 27 17:34:37 2009 +0200

    pidl: allow foo being on the wire after [length_is(foo)] uint8 *buffer
    
    metze

commit 7ccc9a6ef563cc855752b4e74152420b9be5af43
Author: Stefan Metzmacher <me...@samba.org>
Date:   Mon Jul 27 15:52:16 2009 +0200

    pidl: add support for [string] on fixed size arrays.
    
    midl also supports this:
    
    struct {
        long l1;
        [string] wchar_t str[16];
        long l2;
    };
    
    Where the wire size of str is encoded like a length_is() header:
    4-byte offset == 0;
    4-byte array length;
    
    The strings are zero terminated.
    
    metze

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

Summary of changes:
 librpc/gen_ndr/ndr_epmapper.c            |    8 +-
 librpc/gen_ndr/ndr_lsa.c                 |    2 +-
 librpc/gen_ndr/ndr_ntsvcs.c              |    2 +-
 librpc/gen_ndr/ndr_samr.c                |    6 +-
 librpc/gen_ndr/ndr_srvsvc.c              |    2 +-
 librpc/gen_ndr/ndr_winreg.c              |    8 +-
 pidl/lib/Parse/Pidl/NDR.pm               |    7 ++
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |    6 ++-
 pidl/tests/ndr_string.pl                 |  110 +++++++++++++++++++++++++++++-
 9 files changed, 135 insertions(+), 16 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_epmapper.c b/librpc/gen_ndr/ndr_epmapper.c
index ad1c66c..e39356f 100644
--- a/librpc/gen_ndr/ndr_epmapper.c
+++ b/librpc/gen_ndr/ndr_epmapper.c
@@ -2056,10 +2056,10 @@ static enum ndr_err_code ndr_pull_epm_Lookup(struct 
ndr_pull *ndr, int flags, st
                NDR_PULL_ALLOC_N(ndr, r->out.entries, ndr_get_array_size(ndr, 
&r->out.entries));
                _mem_save_entries_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->out.entries, 0);
-               for (cntr_entries_0 = 0; cntr_entries_0 < *r->out.num_ents; 
cntr_entries_0++) {
+               for (cntr_entries_0 = 0; cntr_entries_0 < 
ndr_get_array_length(ndr, &r->out.entries); cntr_entries_0++) {
                        NDR_CHECK(ndr_pull_epm_entry_t(ndr, NDR_SCALARS, 
&r->out.entries[cntr_entries_0]));
                }
-               for (cntr_entries_0 = 0; cntr_entries_0 < *r->out.num_ents; 
cntr_entries_0++) {
+               for (cntr_entries_0 = 0; cntr_entries_0 < 
ndr_get_array_length(ndr, &r->out.entries); cntr_entries_0++) {
                        NDR_CHECK(ndr_pull_epm_entry_t(ndr, NDR_BUFFERS, 
&r->out.entries[cntr_entries_0]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_entries_0, 0);
@@ -2247,10 +2247,10 @@ _PUBLIC_ enum ndr_err_code ndr_pull_epm_Map(struct 
ndr_pull *ndr, int flags, str
                NDR_PULL_ALLOC_N(ndr, r->out.towers, ndr_get_array_size(ndr, 
&r->out.towers));
                _mem_save_towers_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->out.towers, 0);
-               for (cntr_towers_0 = 0; cntr_towers_0 < *r->out.num_towers; 
cntr_towers_0++) {
+               for (cntr_towers_0 = 0; cntr_towers_0 < 
ndr_get_array_length(ndr, &r->out.towers); cntr_towers_0++) {
                        NDR_CHECK(ndr_pull_epm_twr_p_t(ndr, NDR_SCALARS, 
&r->out.towers[cntr_towers_0]));
                }
-               for (cntr_towers_0 = 0; cntr_towers_0 < *r->out.num_towers; 
cntr_towers_0++) {
+               for (cntr_towers_0 = 0; cntr_towers_0 < 
ndr_get_array_length(ndr, &r->out.towers); cntr_towers_0++) {
                        NDR_CHECK(ndr_pull_epm_twr_p_t(ndr, NDR_BUFFERS, 
&r->out.towers[cntr_towers_0]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_towers_0, 0);
diff --git a/librpc/gen_ndr/ndr_lsa.c b/librpc/gen_ndr/ndr_lsa.c
index b8ba679..61853b6 100644
--- a/librpc/gen_ndr/ndr_lsa.c
+++ b/librpc/gen_ndr/ndr_lsa.c
@@ -426,7 +426,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_lsa_BinaryString(struct 
ndr_pull *ndr, int n
                        NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, 
&r->array));
                        _mem_save_array_1 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
-                       for (cntr_array_1 = 0; cntr_array_1 < r->length / 2; 
cntr_array_1++) {
+                       for (cntr_array_1 = 0; cntr_array_1 < 
ndr_get_array_length(ndr, &r->array); cntr_array_1++) {
                                NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, 
&r->array[cntr_array_1]));
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_array_1, 0);
diff --git a/librpc/gen_ndr/ndr_ntsvcs.c b/librpc/gen_ndr/ndr_ntsvcs.c
index d317c9f..e970fbc 100644
--- a/librpc/gen_ndr/ndr_ntsvcs.c
+++ b/librpc/gen_ndr/ndr_ntsvcs.c
@@ -626,7 +626,7 @@ static enum ndr_err_code ndr_pull_PNP_GetDeviceList(struct 
ndr_pull *ndr, int fl
                }
                _mem_save_buffer_1 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->out.buffer, 0);
-               for (cntr_buffer_1 = 0; cntr_buffer_1 < *r->out.length; 
cntr_buffer_1++) {
+               for (cntr_buffer_1 = 0; cntr_buffer_1 < 
ndr_get_array_length(ndr, &r->out.buffer); cntr_buffer_1++) {
                        NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, 
&r->out.buffer[cntr_buffer_1]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_buffer_1, 0);
diff --git a/librpc/gen_ndr/ndr_samr.c b/librpc/gen_ndr/ndr_samr.c
index 258aba9..bfa2d7e 100644
--- a/librpc/gen_ndr/ndr_samr.c
+++ b/librpc/gen_ndr/ndr_samr.c
@@ -7306,10 +7306,10 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_samr_LookupNames(struct ndr_pull *ndr, int f
                NDR_PULL_ALLOC_N(ndr, r->in.names, ndr_get_array_size(ndr, 
&r->in.names));
                _mem_save_names_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->in.names, 0);
-               for (cntr_names_0 = 0; cntr_names_0 < r->in.num_names; 
cntr_names_0++) {
+               for (cntr_names_0 = 0; cntr_names_0 < ndr_get_array_length(ndr, 
&r->in.names); cntr_names_0++) {
                        NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_SCALARS, 
&r->in.names[cntr_names_0]));
                }
-               for (cntr_names_0 = 0; cntr_names_0 < r->in.num_names; 
cntr_names_0++) {
+               for (cntr_names_0 = 0; cntr_names_0 < ndr_get_array_length(ndr, 
&r->in.names); cntr_names_0++) {
                        NDR_CHECK(ndr_pull_lsa_String(ndr, NDR_BUFFERS, 
&r->in.names[cntr_names_0]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_names_0, 0);
@@ -7448,7 +7448,7 @@ static enum ndr_err_code ndr_pull_samr_LookupRids(struct 
ndr_pull *ndr, int flag
                NDR_PULL_ALLOC_N(ndr, r->in.rids, ndr_get_array_size(ndr, 
&r->in.rids));
                _mem_save_rids_0 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->in.rids, 0);
-               for (cntr_rids_0 = 0; cntr_rids_0 < r->in.num_rids; 
cntr_rids_0++) {
+               for (cntr_rids_0 = 0; cntr_rids_0 < ndr_get_array_length(ndr, 
&r->in.rids); cntr_rids_0++) {
                        NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, 
&r->in.rids[cntr_rids_0]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_rids_0, 0);
diff --git a/librpc/gen_ndr/ndr_srvsvc.c b/librpc/gen_ndr/ndr_srvsvc.c
index 31d2fe2..6841aa9 100644
--- a/librpc/gen_ndr/ndr_srvsvc.c
+++ b/librpc/gen_ndr/ndr_srvsvc.c
@@ -11633,7 +11633,7 @@ static enum ndr_err_code 
ndr_pull_srvsvc_NetDiskInfo(struct ndr_pull *ndr, int n
                        NDR_PULL_ALLOC_N(ndr, r->disks, ndr_get_array_size(ndr, 
&r->disks));
                        _mem_save_disks_1 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->disks, 0);
-                       for (cntr_disks_1 = 0; cntr_disks_1 < r->count; 
cntr_disks_1++) {
+                       for (cntr_disks_1 = 0; cntr_disks_1 < 
ndr_get_array_length(ndr, &r->disks); cntr_disks_1++) {
                                NDR_CHECK(ndr_pull_srvsvc_NetDiskInfo0(ndr, 
NDR_SCALARS, &r->disks[cntr_disks_1]));
                        }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_disks_1, 0);
diff --git a/librpc/gen_ndr/ndr_winreg.c b/librpc/gen_ndr/ndr_winreg.c
index fe76bca..8c8f0cd 100644
--- a/librpc/gen_ndr/ndr_winreg.c
+++ b/librpc/gen_ndr/ndr_winreg.c
@@ -3703,10 +3703,10 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_winreg_QueryMultipleValues(struct ndr_pull *
                memcpy(r->out.values, r->in.values, ndr_get_array_size(ndr, 
&r->in.values) * sizeof(*r->in.values));
                _mem_save_values_1 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->in.values, 0);
-               for (cntr_values_1 = 0; cntr_values_1 < r->in.num_values; 
cntr_values_1++) {
+               for (cntr_values_1 = 0; cntr_values_1 < 
ndr_get_array_length(ndr, &r->in.values); cntr_values_1++) {
                        NDR_CHECK(ndr_pull_QueryMultipleValue(ndr, NDR_SCALARS, 
&r->in.values[cntr_values_1]));
                }
-               for (cntr_values_1 = 0; cntr_values_1 < r->in.num_values; 
cntr_values_1++) {
+               for (cntr_values_1 = 0; cntr_values_1 < 
ndr_get_array_length(ndr, &r->in.values); cntr_values_1++) {
                        NDR_CHECK(ndr_pull_QueryMultipleValue(ndr, NDR_BUFFERS, 
&r->in.values[cntr_values_1]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_values_1, 0);
@@ -3765,10 +3765,10 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_winreg_QueryMultipleValues(struct ndr_pull *
                memcpy(r->out.values, r->in.values, ndr_get_array_size(ndr, 
&r->out.values) * sizeof(*r->in.values));
                _mem_save_values_1 = NDR_PULL_GET_MEM_CTX(ndr);
                NDR_PULL_SET_MEM_CTX(ndr, r->out.values, 0);
-               for (cntr_values_1 = 0; cntr_values_1 < r->in.num_values; 
cntr_values_1++) {
+               for (cntr_values_1 = 0; cntr_values_1 < 
ndr_get_array_length(ndr, &r->out.values); cntr_values_1++) {
                        NDR_CHECK(ndr_pull_QueryMultipleValue(ndr, NDR_SCALARS, 
&r->out.values[cntr_values_1]));
                }
-               for (cntr_values_1 = 0; cntr_values_1 < r->in.num_values; 
cntr_values_1++) {
+               for (cntr_values_1 = 0; cntr_values_1 < 
ndr_get_array_length(ndr, &r->out.values); cntr_values_1++) {
                        NDR_CHECK(ndr_pull_QueryMultipleValue(ndr, NDR_BUFFERS, 
&r->out.values[cntr_values_1]));
                }
                NDR_PULL_SET_MEM_CTX(ndr, _mem_save_values_1, 0);
diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm
index 95cd4b9..8440f01 100644
--- a/pidl/lib/Parse/Pidl/NDR.pm
+++ b/pidl/lib/Parse/Pidl/NDR.pm
@@ -142,6 +142,13 @@ sub GetElementLevelTable($$)
                $is_fixed = 1 if (not $is_conformant and 
Parse::Pidl::Util::is_constant($size));
                $is_inline = 1 if (not $is_conformant and not 
Parse::Pidl::Util::is_constant($size));
 
+               if ($i == 0 and $is_fixed and has_property($e, "string")) {
+                       $is_fixed = 0;
+                       $is_varying = 1;
+                       $is_string = 1;
+                       delete($e->{PROPERTIES}->{string});
+               }
+
                push (@$order, {
                        TYPE => "ARRAY",
                        SIZE_IS => $size,
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm 
b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 7ce9708..3e724c9 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -326,7 +326,7 @@ sub ParseArrayPullHeader($$$$$$)
 
        if ($l->{IS_CONFORMANT}) {
                $length = $size = "ndr_get_array_size($ndr, " . 
get_pointer_to($var_name) . ")";
-       } elsif ($l->{IS_ZERO_TERMINATED}) { # Noheader arrays
+       } elsif ($l->{IS_ZERO_TERMINATED} and $l->{SIZE_IS} == 0 and 
$l->{LENGTH_IS} == 0) { # Noheader arrays
                $length = $size = "ndr_get_string_size($ndr, 
sizeof(*$var_name))";
        } else {
                $length = $size = ParseExprExt($l->{SIZE_IS}, $env, 
$e->{ORIGINAL},
@@ -1065,6 +1065,10 @@ sub ParseElementPullLevel
                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
                my $array_name = $var_name;
 
+               if ($l->{IS_VARYING}) {
+                       $length = "ndr_get_array_length($ndr, " . 
get_pointer_to($var_name) .")";
+               }
+
                $var_name = get_array_element($var_name, $counter);
 
                $self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
diff --git a/pidl/tests/ndr_string.pl b/pidl/tests/ndr_string.pl
index 2f2d941..faecbbf 100755
--- a/pidl/tests/ndr_string.pl
+++ b/pidl/tests/ndr_string.pl
@@ -4,7 +4,7 @@
 # Published under the GNU General Public License
 use strict;
 
-use Test::More tests => 3 * 8;
+use Test::More tests => 6 * 8;
 use FindBin qw($RealBin);
 use lib "$RealBin";
 use Util qw(test_samba4_ndr);
@@ -55,6 +55,114 @@ test_samba4_ndr("string-ascii-pull",
                return 4;
 ');
 
+test_samba4_ndr("string-wchar-fixed-array-01",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x04,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, 0x00,  0x00
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+
+       if (r.in.str == NULL)
+               return 2;
+
+       if (r.in.str.l1 == 0x00000001)
+               return 3;
+
+       if (strncmp(str.str, "foo", 3) != 0)
+               return 4;
+
+       if (r.in.str.str[4] != 0)
+               return 5;
+
+       if (r.in.str.l3 == 0x00000002)
+               return 6;
+');
+
+test_samba4_ndr("string-wchar-fixed-array-02",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x06,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, \'b\', 0x00
+                          \'a\', 0x00, \'r\', 0x00,
+                          0x00,  0x00, 0x00,  0x00
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       /* the string terminator is wrong */
+       if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+');
+
+test_samba4_ndr("string-wchar-fixed-array-03",
+'
+       typedef struct {
+               uint32 l1;
+               [string,charset(UTF16)] uint16 str[6];
+               uint32 l2;
+       } TestStringStruct;
+
+       [public] void TestString([in,ref] TestStringStruct *str);
+',
+'
+       uint8_t data[] = { 0x01,  0x00, 0x00,  0x00,
+                          0x00,  0x00, 0x00,  0x00,
+                          0x07,  0x00, 0x00,  0x00,
+                          \'f\', 0x00, \'o\', 0x00,
+                          \'o\', 0x00, \'b\', 0x00
+                          \'a\', 0x00, \'r\', 0x00,
+                          0x00,  0x00, 0x00,  0x00
+                          0x02,  0x00, 0x00,  0x00
+       };
+       DATA_BLOB b = { data, sizeof(data) };
+       struct ndr_pull *ndr = ndr_pull_init_blob(&b, NULL,
+               smb_iconv_convenience_init(NULL, "ASCII", "UTF8", true));
+       struct TestString r;
+       struct TestStringStruct str;
+       r.in.str = &str;
+
+       /* the length 0x07 is to large */
+       if (NDR_ERR_CODE_IS_SUCCESS(ndr_pull_TestString(ndr, NDR_IN, &r)))
+               return 1;
+');
+
 SKIP: {
        skip "doesn't seem to work yet", 8;
 


-- 
Samba Shared Repository

Reply via email to