pidl/Python: improve error paths for Exceptions during the PyList construction
authorStefan Metzmacher <metze@samba.org>
Tue, 9 May 2017 07:17:20 +0000 (09:17 +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 86e45fe1c23291ef370df51ace5fe58695a5af5d..efb3265a5da17d6c414afa73221f590b84c452c1 100644 (file)
@@ -2219,6 +2219,7 @@ sub ConvertObjectToPythonLevel($$$$$$$)
                        $length = ParseExpr($length, $env, $e);
                        $self->pidl("$py_var = PyList_New($length);");
                        $self->fail_on_null($py_var, $fail);
+                       my $fail2 = "Py_DECREF($py_var); $fail";
                        $self->pidl("{");
                        $self->indent;
                        my $counter = "$e->{NAME}_cntr_$l->{LEVEL_INDEX}";
@@ -2226,9 +2227,16 @@ sub ConvertObjectToPythonLevel($$$$$$$)
                        $self->pidl("for ($counter = 0; $counter < ($length); $counter++) {");
                        $self->indent;
                        my $member_var = "py_$e->{NAME}_$l->{LEVEL_INDEX}";
+                       my $ret_var = "ret_$e->{NAME}_$l->{LEVEL_INDEX}";
                        $self->pidl("PyObject *$member_var;");
-                       $self->ConvertObjectToPythonLevel($var_name, $env, $e, $nl, $var_name."[$counter]", $member_var, $fail, $recurse);
-                       $self->pidl("PyList_SetItem($py_var, $counter, $member_var);");
+                       $self->pidl("int $ret_var;");
+                       $self->ConvertObjectToPythonLevel($var_name, $env, $e, $nl, $var_name."[$counter]", $member_var, $fail2, $recurse);
+                       $self->pidl("$ret_var = PyList_SetItem($py_var, $counter, $member_var);");
+                       $self->pidl("if ($ret_var != 0) {");
+                       $self->indent;
+                       $self->pidl($fail2);
+                       $self->deindent;
+                       $self->pidl("}");
                        $self->deindent;
                        $self->pidl("}");
                        $self->deindent;