pidl/Python: improve generation of error checking in FromPythonToUnionFunction()
authorStefan Metzmacher <metze@samba.org>
Tue, 9 May 2017 14:05:12 +0000 (16:05 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:48:38 +0000 (12:48 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
pidl/lib/Parse/Pidl/Samba4/Python.pm

index 70cb7d5eee2bd683429ad444a446388a74ee1b1b..570e8675eda3ffcecf34470eeac27408d1bd1c10 100644 (file)
@@ -169,17 +169,27 @@ sub FromPythonToUnionFunction($$$$$)
 
        my $has_default = 0;
 
-       $self->pidl("$typename *ret = talloc_zero($mem_ctx, $typename);");
+       $self->pidl("$typename *ret = NULL;");
+       $self->pidl("");
+       $self->pidl("ret = talloc_zero($mem_ctx, $typename);");
+       $self->pidl("if (ret == NULL) {");
+       $self->indent;
+       $self->pidl("PyErr_NoMemory();");
+       $self->pidl("return NULL;");
+       $self->deindent;
+       $self->pidl("}");
+       $self->pidl("");
+
+       my $fail = "TALLOC_FREE(ret); return NULL;";
 
        $self->pidl("switch ($switch) {");
-       $self->indent;
 
        foreach my $e (@{$type->{ELEMENTS}}) {
                $self->pidl("$e->{CASE}:");
                if ($e->{CASE} eq "default") { $has_default = 1; }
                $self->indent;
                if ($e->{NAME}) {
-                       $self->ConvertObjectFromPython({}, "ret", $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
+                       $self->ConvertObjectFromPython({}, "ret", $e, $name, "ret->$e->{NAME}", $fail);
                }
                $self->pidl("break;");
                $self->deindent;
@@ -190,12 +200,11 @@ sub FromPythonToUnionFunction($$$$$)
                $self->pidl("default:");
                $self->indent;
                $self->pidl("PyErr_SetString(PyExc_TypeError, \"invalid union level value\");");
-               $self->pidl("talloc_free(ret);");
-               $self->pidl("ret = NULL;");
+               $self->pidl("TALLOC_FREE(ret);");
+               $self->pidl("break;");
                $self->deindent;
        }
 
-       $self->deindent;
        $self->pidl("}");
        $self->pidl("");
        $self->pidl("return ret;");