pidl: Use a tmp_ctx helper variable
authorAndrew Bartlett <abartlet@samba.org>
Thu, 25 Feb 2016 00:57:37 +0000 (13:57 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 8 Mar 2016 00:58:26 +0000 (01:58 +0100)
This is so we free the ndr_push_struct_blob() return value after
we make it into a string

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
pidl/lib/Parse/Pidl/Samba4/Python.pm

index 62de4870228420c27d2353a8b5eaf04cdd8f257a..6488ac9c73b02dbcd834d3975de5bb72a3e188c9 100644 (file)
@@ -269,17 +269,28 @@ sub PythonStruct($$$$$$)
                $self->pidl("{");
                $self->indent;
                $self->pidl("$cname *object = ($cname *)pytalloc_get_ptr(py_obj);");
+               $self->pidl("PyObject *ret = NULL;");
                $self->pidl("DATA_BLOB blob;");
                $self->pidl("enum ndr_err_code err;");
-               $self->pidl("err = ndr_push_struct_blob(&blob, pytalloc_get_mem_ctx(py_obj), object, (ndr_push_flags_fn_t)ndr_push_$name);");
+               $self->pidl("TALLOC_CTX *tmp_ctx = talloc_new(pytalloc_get_mem_ctx(py_obj));");
+               $self->pidl("if (tmp_ctx == NULL) {");
+               $self->indent;
+               $self->pidl("PyErr_SetNdrError(NDR_ERR_ALLOC);");
+               $self->pidl("return NULL;");
+               $self->deindent;
+               $self->pidl("}");
+               $self->pidl("err = ndr_push_struct_blob(&blob, tmp_ctx, object, (ndr_push_flags_fn_t)ndr_push_$name);");
                $self->pidl("if (err != NDR_ERR_SUCCESS) {");
                $self->indent;
+               $self->pidl("TALLOC_FREE(tmp_ctx);");
                $self->pidl("PyErr_SetNdrError(err);");
                $self->pidl("return NULL;");
                $self->deindent;
                $self->pidl("}");
                $self->pidl("");
-               $self->pidl("return PyString_FromStringAndSize((char *)blob.data, blob.length);");
+               $self->pidl("ret = PyString_FromStringAndSize((char *)blob.data, blob.length);");
+               $self->pidl("TALLOC_FREE(tmp_ctx);");
+               $self->pidl("return ret;");
                $self->deindent;
                $self->pidl("}");
                $self->pidl("");