diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2007-02-19 19:42:51 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:48:37 -0500 |
commit | 29cdad41817f5bb3c9c79c4cbb8f94244b21b9e1 (patch) | |
tree | dc9cc868617571fe7381229e81fa2ccfebc62b54 /source4/pidl/lib | |
parent | 908bc58cdd2642fe61f6e3a07e9d362de6e18ae6 (diff) | |
download | samba-29cdad41817f5bb3c9c79c4cbb8f94244b21b9e1.tar.gz samba-29cdad41817f5bb3c9c79c4cbb8f94244b21b9e1.tar.bz2 samba-29cdad41817f5bb3c9c79c4cbb8f94244b21b9e1.zip |
r21455: Fix a bug in our handling of conformant arrays. The conformant array was
always pushed, even if just the buffers part of a struct had to be pushed.
Pull was not affected.
(This used to be commit ffe387920473fb365f740942098085eb40299c84)
Diffstat (limited to 'source4/pidl/lib')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index a4957fc7d9..8393d6f3c0 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -12,7 +12,7 @@ require Exporter; @EXPORT = qw(is_charset_array); @EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction - NeededElement NeededType); + NeededElement NeededType $res); use strict; use Parse::Pidl::Typelist qw(hasType getType mapTypeName); @@ -110,7 +110,7 @@ sub get_value_of($) } } -my $res; +our $res; my $deferred = []; my $tabs = ""; @@ -1194,6 +1194,34 @@ sub ParseStructPushPrimitives($$$$) { my ($struct, $name, $varname, $env) = @_; + # see if the structure contains a conformant array. If it + # does, then it must be the last element of the structure, and + # we need to push the conformant length early, as it fits on + # the wire before the structure (and even before the structure + # alignment) + if (defined($struct->{SURROUNDING_ELEMENT})) { + my $e = $struct->{SURROUNDING_ELEMENT}; + + if (defined($e->{LEVELS}[0]) and + $e->{LEVELS}[0]->{TYPE} eq "ARRAY") { + my $size; + + if ($e->{LEVELS}[0]->{IS_ZERO_TERMINATED}) { + if (has_property($e, "charset")) { + $size = "ndr_charset_length($varname->$e->{NAME}, CH_$e->{PROPERTIES}->{charset})"; + } else { + $size = "ndr_string_length($varname->$e->{NAME}, sizeof(*$varname->$e->{NAME}))"; + } + } else { + $size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL}); + } + + pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $size));"; + } else { + pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, $varname->$e->{NAME})));"; + } + } + pidl "NDR_CHECK(ndr_push_align(ndr, $struct->{ALIGN}));"; if (defined($struct->{PROPERTIES}{relative_base})) { @@ -1232,34 +1260,6 @@ sub ParseStructPush($$$) start_flags($struct); - # see if the structure contains a conformant array. If it - # does, then it must be the last element of the structure, and - # we need to push the conformant length early, as it fits on - # the wire before the structure (and even before the structure - # alignment) - if (defined($struct->{SURROUNDING_ELEMENT})) { - my $e = $struct->{SURROUNDING_ELEMENT}; - - if (defined($e->{LEVELS}[0]) and - $e->{LEVELS}[0]->{TYPE} eq "ARRAY") { - my $size; - - if ($e->{LEVELS}[0]->{IS_ZERO_TERMINATED}) { - if (has_property($e, "charset")) { - $size = "ndr_charset_length($varname->$e->{NAME}, CH_$e->{PROPERTIES}->{charset})"; - } else { - $size = "ndr_string_length($varname->$e->{NAME}, sizeof(*$varname->$e->{NAME}))"; - } - } else { - $size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL}); - } - - pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, $size));"; - } else { - pidl "NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_string_array_size(ndr, $varname->$e->{NAME})));"; - } - } - pidl "if (ndr_flags & NDR_SCALARS) {"; indent; ParseStructPushPrimitives($struct, $name, $varname, $env); |