pidl: cope with bad type conversions in unions
authorAndrew Tridgell <tridge@samba.org>
Sun, 22 Aug 2010 04:47:22 +0000 (14:47 +1000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 22 Aug 2010 04:57:34 +0000 (14:57 +1000)
This prevents a crash when converting bad types in NDR unions

Pair-Programmed-With: Jelmer Vernooij <jelmer@samba.org>

pidl/lib/Parse/Pidl/Samba4/Python.pm

index b7d70fafaf4de742fd1c426c3da79ed701d55773..f7968b4e0a7320867ecdf36c9f6c893dd4f31a64 100644 (file)
@@ -986,7 +986,15 @@ sub ConvertObjectFromPythonLevel($$$$$$$$)
        } elsif ($l->{TYPE} eq "SWITCH") {
                $var_name = get_pointer_to($var_name);
                my $switch = ParseExpr($l->{SWITCH_IS}, $env, $e);
-               $self->assign($var_name, "py_export_" . GetNextLevel($e, $l)->{DATA_TYPE} . "($mem_ctx, $switch, $py_var)");
+               my $switch_ptr = "$e->{NAME}_switch_$l->{LEVEL_INDEX}";
+               $self->pidl("{");
+               $self->indent;
+               $self->pidl("void *$switch_ptr;");
+               $self->pidl("$switch_ptr = py_export_" . GetNextLevel($e, $l)->{DATA_TYPE} . "($mem_ctx, $switch, $py_var);");
+               $self->pidl("if ($switch_ptr == NULL) { $fail }");
+               $self->assign($var_name, "$switch_ptr");
+               $self->deindent;
+               $self->pidl("}");
        } elsif ($l->{TYPE} eq "SUBCONTEXT") {
                $self->ConvertObjectFromPythonLevel($env, $mem_ctx, $py_var, $e, GetNextLevel($e, $l), $var_name, $fail);
        } else {