summaryrefslogtreecommitdiff
path: root/source4/pidl/lib/Parse
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2007-02-19 19:42:51 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:48:37 -0500
commit29cdad41817f5bb3c9c79c4cbb8f94244b21b9e1 (patch)
treedc9cc868617571fe7381229e81fa2ccfebc62b54 /source4/pidl/lib/Parse
parent908bc58cdd2642fe61f6e3a07e9d362de6e18ae6 (diff)
downloadsamba-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/Parse')
-rw-r--r--source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm60
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);