From ed11ce8f12d567a3e0edc1d24aab1784a171ac33 Mon Sep 17 00:00:00 2001 From: Douglas Bagnall Date: Wed, 4 May 2016 16:51:37 +1200 Subject: [PATCH] Python pidl: avoid segfault with "del obj->attr" Deleting an attribute in Python (using the "del" statement) is (at some stages along a winding path, for C objects) converted into setting the attribute to NULL. Not None, actual NULL. The way we handled this NULL was to dereference it. This changes the behaviour to raising an AttributeError, which is more or less what Python does in similar situations with builtin objects. Signed-off-by: Douglas Bagnall Reviewed-by: Andrew Bartlett --- pidl/lib/Parse/Pidl/Samba4/Python.pm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index 9e39167eb7e..f43e4d62443 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -1218,6 +1218,14 @@ sub ConvertObjectFromPythonLevel($$$$$$$$) $pl = GetPrevLevel($e, $pl); } + $self->pidl("if ($py_var == NULL) {"); + $self->indent; + $self->pidl("PyErr_Format(PyExc_AttributeError, \"Cannot delete NDR object: " . + mapTypeName($var_name) . "\");"); + $self->pidl($fail); + $self->deindent; + $self->pidl("}"); + if ($l->{TYPE} eq "POINTER") { if ($l->{POINTER_TYPE} ne "ref") { $self->pidl("if ($py_var == Py_None) {");