* make pidl.pl exit with an error on a parse error
authorAndrew Tridgell <tridge@samba.org>
Fri, 14 Nov 2003 13:15:20 +0000 (13:15 +0000)
committerAndrew Tridgell <tridge@samba.org>
Fri, 14 Nov 2003 13:15:20 +0000 (13:15 +0000)
* fixed a buffers/scalars bug in structures
(This used to be commit e66daf527357c65228db55a3d3319a0c20d8f51c)

source4/build/pidl/parser.pm
source4/build/pidl/pidl.pl

index 82204e28d6c47fa6bbf25521872efb1c28207042..7d9885312299369553d75a500a70aab42c927963 100644 (file)
@@ -221,7 +221,7 @@ sub ParseElementPullSwitch($$$$)
 
        $res .= "\t{ uint16 _level;\n";
        $res .= "\tNDR_CHECK(ndr_pull_$e->{TYPE}(ndr, $ndr_flags, &_level, $cprefix$var_prefix$e->{NAME}));\n";
-       $res .= "\tif (_level != $switch_var) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u in $e->{NAME}\");\n";
+       $res .= "\tif ((($ndr_flags) & NDR_SCALARS) && (_level != $switch_var)) return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u in $e->{NAME}\");\n";
        $res .= "\t}\n";
 }
 
@@ -309,6 +309,8 @@ sub ParseElementPushBuffer($$$)
                }
        } elsif (util::is_builtin_type($e->{TYPE})) {
                $res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $cprefix$var_prefix$e->{NAME}));\n";
+       } elsif ($e->{POINTERS}) {
+               $res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, NDR_SCALARS|NDR_BUFFERS, $cprefix$var_prefix$e->{NAME}));\n";
        } else {
                $res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $ndr_flags, $cprefix$var_prefix$e->{NAME}));\n";
        }
@@ -441,7 +443,7 @@ sub ParseStructPush($)
        $res .= "buffers:\n";
        $res .= "\tif (!(ndr_flags & NDR_BUFFERS)) goto done;\n";
        foreach my $e (@{$struct->{ELEMENTS}}) {
-               ParseElementPushBuffer($e, "r->", "ndr_flags");
+               ParseElementPushBuffer($e, "r->", "NDR_BUFFERS");
        }
 
        if (defined $struct_len) {
@@ -541,7 +543,7 @@ sub ParseStructPull($)
        $res .= "buffers:\n";
        $res .= "\tif (!(ndr_flags & NDR_BUFFERS)) goto done;\n";
        foreach my $e (@{$struct->{ELEMENTS}}) {
-               ParseElementPullBuffer($e, "r->", "ndr_flags");
+               ParseElementPullBuffer($e, "r->", "NDR_BUFFERS");
        }
 
        if (defined $struct_len) {
@@ -817,7 +819,9 @@ sub ParseFunctionPull($)
                                $res .= "\t}\n";
                        } else {
                                ParseElementPullScalar($e, "r->out.", "NDR_SCALARS|NDR_BUFFERS");
-                               ParseElementPullBuffer($e, "r->out.", "NDR_SCALARS|NDR_BUFFERS");
+                               if ($e->{POINTERS}) {
+                                       ParseElementPullBuffer($e, "r->out.", "NDR_SCALARS|NDR_BUFFERS");
+                               }
                        }
                }
        }
index cd2ad9d7fc540b2f92a306da7abf3975339252c0..2b856b2e4790cbeff3fea9dc8b36e7880de3ca39 100755 (executable)
@@ -111,6 +111,7 @@ my($pidl_file) = util::ChangeExtension($opt_output, "pidl");
 if ($opt_parse) {
     print "Generating $pidl_file from $idl_file\n";
     my($idl) = IdlParse($idl_file);
+    defined $idl || die "Failed to parse $idl_file";
     util::SaveStructure($pidl_file, $idl) || die "Failed to save $pidl_file";
 }