From e598a664c2d4769023cbdd5e10c3823c2b9a53a8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 20 Feb 2017 18:02:09 +0100 Subject: [PATCH] pidl:Python: use of pytalloc_GenericObject_reference*() for pyrpc_{ex,im}port_union() wrapping BUG: https://bugzilla.samba.org/show_bug.cgi?id=12601 Signed-off-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Sat Feb 25 06:33:33 CET 2017 on sn-devel-144 (cherry picked from commit 2170f556299c6ab4ce33f22169ca26ecad3440e3) --- pidl/lib/Parse/Pidl/Samba4/Python.pm | 85 +++--------------------------------- source4/librpc/rpc/pyrpc_util.c | 44 ++----------------- 2 files changed, 11 insertions(+), 118 deletions(-) diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index e7b127d40b7..f871e04be60 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -1181,29 +1181,15 @@ sub PythonType($$$$) my $py_methods = "NULL"; my $typename = mapTypeName($d); - ## - ## PyCapsule (starting with 2.7) vs. PyCObject (up to 3.2) - ## - ## As we need to support python 2.6, we can't use PyCapsule yet. - ## - ## When we'll get support fpr Python3 we'll have to emulate - ## PyCObject using PyCapsule and convert these functions to - ## use PyCapsule. - ## $self->pidl("static PyObject *py_$d->{NAME}\_import(PyTypeObject *type, PyObject *args, PyObject *kwargs)"); $self->pidl("{"); $self->indent; $self->pidl("const char * const kwnames[] = { \"mem_ctx\", \"level\", \"in\", NULL };"); $self->pidl("PyObject *mem_ctx_obj = NULL;"); - $self->pidl("static const char *mem_ctx_type = \"TALLOC_CTX\";"); - $self->pidl("const char *mem_ctx_desc = NULL;"); $self->pidl("TALLOC_CTX *mem_ctx = NULL;"); $self->pidl("int level = 0;"); $self->pidl("PyObject *in_obj = NULL;"); - $self->pidl("static const char *in_type = \"$typename\";"); - $self->pidl("const char *in_desc = NULL;"); $self->pidl("$typename *in = NULL;"); - $self->pidl("int cmp;"); $self->pidl(""); $self->pidl("if (!PyArg_ParseTupleAndKeywords(args, kwargs, \"OiO:import\","); $self->indent; @@ -1216,54 +1202,20 @@ sub PythonType($$$$) $self->pidl("return NULL;"); $self->deindent; $self->pidl("}"); - $self->pidl("if (!PyCObject_Check(mem_ctx_obj)) {"); - $self->indent; - $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx needs to be of type PyCObject!\");"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("mem_ctx_desc = (const char *)PyCObject_GetDesc(mem_ctx_obj);"); - $self->indent; - $self->pidl("if (mem_ctx_desc == NULL) {"); - $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx hash no PyCObject_GetDesc()!\");"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("cmp = strncmp(mem_ctx_type, mem_ctx_desc, strlen(mem_ctx_type) + 1);"); - $self->pidl("if (cmp != 0) {"); - $self->indent; - $self->pidl("PyErr_Format(PyExc_TypeError, \"mem_ctx should have PyCObject_GetDesc() = %s!\", mem_ctx_type);"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("mem_ctx = PyCObject_AsVoidPtr(mem_ctx_obj);"); + $self->pidl("mem_ctx = pytalloc_get_ptr(mem_ctx_obj);"); $self->pidl("if (mem_ctx == NULL) {"); $self->indent; $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx is NULL)!\");"); $self->pidl("return NULL;"); $self->deindent; $self->pidl("}"); - $self->pidl("if (!PyCObject_Check(in_obj)) {"); - $self->indent; - $self->pidl("PyErr_SetString(PyExc_TypeError, \"in needs to be of type PyCObject!\");"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("in_desc = (const char *)PyCObject_GetDesc(in_obj);"); + $self->pidl("in = ($typename *)pytalloc_get_ptr(in_obj);"); + $self->pidl("if (in == NULL) {"); $self->indent; - $self->pidl("if (in_desc == NULL) {"); - $self->pidl("PyErr_SetString(PyExc_TypeError, \"in hash no PyCObject_GetDesc()!\");"); + $self->pidl("PyErr_Format(PyExc_TypeError, \"in needs to be a pointer to $typename!\");"); $self->pidl("return NULL;"); $self->deindent; $self->pidl("}"); - $self->pidl("cmp = strncmp(in_type, in_desc, strlen(in_type) + 1);"); - $self->pidl("if (cmp != 0) {"); - $self->indent; - $self->pidl("PyErr_Format(PyExc_TypeError, \"in should have PyCObject_GetDesc() = %s!\", in_type);"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("in = ($typename *)PyCObject_AsVoidPtr(in_obj);"); $self->pidl(""); $self->pidl("return py_import_$d->{NAME}(mem_ctx, level, in);"); $self->deindent; @@ -1275,14 +1227,10 @@ sub PythonType($$$$) $self->indent; $self->pidl("const char * const kwnames[] = { \"mem_ctx\", \"level\", \"in\", NULL };"); $self->pidl("PyObject *mem_ctx_obj = NULL;"); - $self->pidl("static const char *mem_ctx_type = \"TALLOC_CTX\";"); - $self->pidl("const char *mem_ctx_desc = NULL;"); $self->pidl("TALLOC_CTX *mem_ctx = NULL;"); $self->pidl("int level = 0;"); $self->pidl("PyObject *in = NULL;"); - $self->pidl("static const char *out_type = \"$typename\";"); $self->pidl("$typename *out = NULL;"); - $self->pidl("int cmp;"); $self->pidl(""); $self->pidl("if (!PyArg_ParseTupleAndKeywords(args, kwargs, \"OiO:import\","); $self->indent; @@ -1295,27 +1243,7 @@ sub PythonType($$$$) $self->pidl("return NULL;"); $self->deindent; $self->pidl("}"); - $self->pidl("if (!PyCObject_Check(mem_ctx_obj)) {"); - $self->indent; - $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx needs to be of type PyCObject!\");"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("mem_ctx_desc = (const char *)PyCObject_GetDesc(mem_ctx_obj);"); - $self->indent; - $self->pidl("if (mem_ctx_desc == NULL) {"); - $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx hash no PyCObject_GetDesc()!\");"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("cmp = strncmp(mem_ctx_type, mem_ctx_desc, strlen(mem_ctx_type) + 1);"); - $self->pidl("if (cmp != 0) {"); - $self->indent; - $self->pidl("PyErr_Format(PyExc_TypeError, \"mem_ctx should have PyCObject_GetDesc() = %s!\", mem_ctx_type);"); - $self->pidl("return NULL;"); - $self->deindent; - $self->pidl("}"); - $self->pidl("mem_ctx = PyCObject_AsVoidPtr(mem_ctx_obj);"); + $self->pidl("mem_ctx = pytalloc_get_ptr(mem_ctx_obj);"); $self->pidl("if (mem_ctx == NULL) {"); $self->indent; $self->pidl("PyErr_SetString(PyExc_TypeError, \"mem_ctx is NULL)!\");"); @@ -1329,7 +1257,8 @@ sub PythonType($$$$) $self->pidl("return NULL;"); $self->deindent; $self->pidl("}"); - $self->pidl("return PyCObject_FromVoidPtrAndDesc(out, discard_const_p(char, out_type), NULL);"); + $self->pidl(""); + $self->pidl("return pytalloc_GenericObject_reference(out);"); $self->deindent; $self->pidl("}"); $self->pidl(""); diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c index cfbb9cb1977..fe0e2de8355 100644 --- a/source4/librpc/rpc/pyrpc_util.c +++ b/source4/librpc/rpc/pyrpc_util.c @@ -394,21 +394,16 @@ PyObject *PyString_FromStringOrNULL(const char *str) PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, const void *in, const char *typename) { - static const char *mem_ctx_type = "TALLOC_CTX"; PyObject *mem_ctx_obj = NULL; PyObject *in_obj = NULL; PyObject *ret = NULL; - mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx, - discard_const_p(char, mem_ctx_type), - NULL); + mem_ctx_obj = pytalloc_GenericObject_reference(mem_ctx); if (mem_ctx_obj == NULL) { return NULL; } - in_obj = PyCObject_FromVoidPtrAndDesc(discard_const(in), - discard_const_p(char, typename), - NULL); + in_obj = pytalloc_GenericObject_reference_ex(mem_ctx, discard_const(in)); if (in_obj == NULL) { Py_XDECREF(mem_ctx_obj); return NULL; @@ -430,16 +425,11 @@ PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, PyObject *in, const char *typename) { - static const char *mem_ctx_type = "TALLOC_CTX"; PyObject *mem_ctx_obj = NULL; PyObject *ret_obj = NULL; - const char *ret_desc = NULL; void *ret = NULL; - int cmp; - mem_ctx_obj = PyCObject_FromVoidPtrAndDesc(mem_ctx, - discard_const_p(char, mem_ctx_type), - NULL); + mem_ctx_obj = pytalloc_GenericObject_reference(mem_ctx); if (mem_ctx_obj == NULL) { return NULL; } @@ -453,33 +443,7 @@ void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level, return NULL; } - if (!PyCObject_Check(ret_obj)) { - Py_XDECREF(ret_obj); - PyErr_Format(PyExc_TypeError, - "New %s.__export__() returned no PyCObject!", - type->tp_name); - return NULL; - } - - ret_desc = (const char *)PyCObject_GetDesc(ret_obj); - if (ret_desc == NULL) { - Py_XDECREF(ret_obj); - PyErr_Format(PyExc_TypeError, - "New %s.__export__() returned no PyCObject_GetDesc()!", - type->tp_name); - return NULL; - } - - cmp = strncmp(typename, ret_desc, strlen(typename) + 1); - if (cmp != 0) { - Py_XDECREF(ret_obj); - PyErr_Format(PyExc_TypeError, - "New %s.__export__() returned PyCObject_GetDesc() != %s!", - type->tp_name, typename); - return NULL; - } - - ret = PyCObject_AsVoidPtr(ret_obj); + ret = _pytalloc_get_type(ret_obj, typename); Py_XDECREF(ret_obj); return ret; } -- 2.11.4.GIT