pidl: Mismatch between set and get of relative base pointers
authorAndrew Bartlett <abartlet@samba.org>
Fri, 15 Nov 2019 07:04:41 +0000 (20:04 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 12 Dec 2019 02:30:40 +0000 (02:30 +0000)
The set was within the switch, the get was before the switch.

The difference is shown when there is an empty default element.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13876

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index d51063f72168f3c2f0b897061cbea66755dbb89e..31dce4bc2ba98d649948ad8ba18f3379b804814f 100644 (file)
@@ -2109,11 +2109,6 @@ sub ParseUnionPullDeferred($$$$)
        my ($self,$e,$ndr,$varname) = @_;
        my $have_default = 0;
 
-       if (defined($e->{PROPERTIES}{relative_base})) {
-               # retrieve the current offset as base for relative pointers
-               # based on the toplevel struct/union
-               $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset2($ndr, $varname));");
-       }
        $self->pidl("switch (level) {");
        $self->indent;
        foreach my $el (@{$e->{ELEMENTS}}) {
@@ -2124,6 +2119,11 @@ sub ParseUnionPullDeferred($$$$)
                $self->pidl("$el->{CASE}:");
                if ($el->{TYPE} ne "EMPTY") {
                        $self->indent;
+                       if (defined($e->{PROPERTIES}{relative_base})) {
+                               # retrieve the current offset as base for relative pointers
+                               # based on the toplevel struct/union
+                               $self->pidl("NDR_CHECK(ndr_pull_setup_relative_base_offset2($ndr, $varname));");
+                       }
                        $self->ParseElementPull($el, $ndr, {$el->{NAME} => "$varname->$el->{NAME}"}, 0, 1);
                        $self->deindent;
                }