[SCM] Samba Shared Repository - branch master updated

Noel Power npower at samba.org
Tue Jan 29 15:55:02 UTC 2019


The branch, master has been updated
       via  ca93b1e15a1 s4/param/provision py_dom_sid_FromSid: avoid python memleak
       via  a3aa5af3d56 s4/pyrpc_util: catch alloc failure in py_dcerpc_interface_init_helper()
       via  e23b9f88cc1 s4/pyrpc_util: appropriately decrement refcounts on failure
       via  3584fe46d92 s3/py_passdb: maintain correct refcount on allocation failure
       via  1f07c478ec1 python/modules: maintain correct refcount for path items
      from  e1324580391 tests: don't rely on implicit int return type

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ca93b1e15a1c0606fe7e2d149af30cc0168fdb7b
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu May 3 09:59:13 2018 +1200

    s4/param/provision py_dom_sid_FromSid: avoid python memleak
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Noel Power <npower at samba.org>
    
    Autobuild-User(master): Noel Power <npower at samba.org>
    Autobuild-Date(master): Tue Jan 29 16:54:48 CET 2019 on sn-devel-144

commit a3aa5af3d5600b510a3289c5ab16610263f26c4f
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu May 3 09:57:29 2018 +1200

    s4/pyrpc_util: catch alloc failure in py_dcerpc_interface_init_helper()
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Noel Power <npower at samba.org>

commit e23b9f88cc1c8a8c8cda07fb25d639218c12d91a
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu May 3 09:53:56 2018 +1200

    s4/pyrpc_util: appropriately decrement refcounts on failure
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Noel Power <npower at samba.org>

commit 3584fe46d92037c1fb9825d7d25ecc9bdd60c0f4
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu May 3 09:39:18 2018 +1200

    s3/py_passdb: maintain correct refcount on allocation failure
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Noel Power <npower at samba.org>

commit 1f07c478ec1823c322b0de4db1a51029de8e5056
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Thu May 3 10:45:39 2018 +1200

    python/modules: maintain correct refcount for path items
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Noel Power <npower at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 python/modules.c                | 29 +++++++++++++++++++----------
 source3/passdb/py_passdb.c      |  6 ++++++
 source4/librpc/rpc/pyrpc_util.c | 27 +++++++++++++++++++++++++++
 source4/param/provision.c       | 10 ++++++----
 4 files changed, 58 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/python/modules.c b/python/modules.c
index 5db3dd348e2..ae91b0939ae 100644
--- a/python/modules.c
+++ b/python/modules.c
@@ -25,16 +25,20 @@
 
 static bool PySys_PathPrepend(PyObject *list, const char *path)
 {
+	bool ok;
 	PyObject *py_path = PyStr_FromString(path);
-	if (py_path == NULL)
+	if (py_path == NULL) {
 		return false;
-
-	return (PyList_Insert(list, 0, py_path) == 0);
+	}
+	ok = PyList_Insert(list, 0, py_path) == 0;
+	Py_XDECREF(py_path);
+	return ok;
 }
 
 bool py_update_path(void)
 {
-	PyObject *mod_sys, *py_path;
+	PyObject *mod_sys = NULL;
+	PyObject *py_path = NULL;
 
 	mod_sys = PyImport_ImportModule("sys");
 	if (mod_sys == NULL) {
@@ -43,22 +47,27 @@ bool py_update_path(void)
 
 	py_path = PyObject_GetAttrString(mod_sys, "path");
 	if (py_path == NULL) {
-		return false;
-	}	
+		goto error;
+	}
 
 	if (!PyList_Check(py_path)) {
-		return false;
+		goto error;
 	}
 
 	if (!PySys_PathPrepend(py_path, dyn_PYTHONDIR)) {
-		return false;
+		goto error;
 	}
 
 	if (strcmp(dyn_PYTHONARCHDIR, dyn_PYTHONDIR) != 0) {
 		if (!PySys_PathPrepend(py_path, dyn_PYTHONARCHDIR)) {
-			return false;
+			goto error;
 		}
 	}
-
+	Py_XDECREF(py_path);
+	Py_XDECREF(mod_sys);
 	return true;
+error:
+	Py_XDECREF(py_path);
+	Py_XDECREF(mod_sys);
+	return false;
 }
diff --git a/source3/passdb/py_passdb.c b/source3/passdb/py_passdb.c
index 1b4ec3d531e..2ac2942a47f 100644
--- a/source3/passdb/py_passdb.c
+++ b/source3/passdb/py_passdb.c
@@ -3945,6 +3945,7 @@ MODULE_INIT_FUNC(passdb)
 
 	dom_sid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "dom_sid");
 	if (dom_sid_Type == NULL) {
+		Py_DECREF(mod);
 		talloc_free(frame);
 		return NULL;
 	}
@@ -3953,6 +3954,7 @@ MODULE_INIT_FUNC(passdb)
 	security_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "descriptor");
 	Py_DECREF(mod);
 	if (security_Type == NULL) {
+		Py_DECREF(dom_sid_Type);
 		talloc_free(frame);
 		return NULL;
 	}
@@ -3960,6 +3962,8 @@ MODULE_INIT_FUNC(passdb)
 	/* Import GUID type from dcerpc.misc */
 	mod = PyImport_ImportModule("samba.dcerpc.misc");
 	if (mod == NULL) {
+		Py_DECREF(security_Type);
+		Py_DECREF(dom_sid_Type);
 		talloc_free(frame);
 		return NULL;
 	}
@@ -3967,6 +3971,8 @@ MODULE_INIT_FUNC(passdb)
 	guid_Type = (PyTypeObject *)PyObject_GetAttrString(mod, "GUID");
 	Py_DECREF(mod);
 	if (guid_Type == NULL) {
+		Py_DECREF(security_Type);
+		Py_DECREF(dom_sid_Type);
 		talloc_free(frame);
 		return NULL;
 	}
diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c
index 3a151e1591f..6dadc214ea5 100644
--- a/source4/librpc/rpc/pyrpc_util.c
+++ b/source4/librpc/rpc/pyrpc_util.c
@@ -116,6 +116,11 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 	}
 
 	ret = PyObject_New(dcerpc_InterfaceObject, type);
+	if (ret == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+
 	ret->pipe = NULL;
 	ret->binding_handle = NULL;
 	ret->mem_ctx = talloc_new(NULL);
@@ -132,6 +137,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (event_ctx == NULL) {
 			PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -139,6 +145,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (lp_ctx == NULL) {
 			PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -147,6 +154,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (!NT_STATUS_IS_OK(status)) {
 			PyErr_SetNTSTATUS(status);
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 	} else if (py_basis != Py_None) {
@@ -157,6 +165,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		py_base = PyImport_ImportModule("samba.dcerpc.base");
 		if (py_base == NULL) {
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -164,12 +173,17 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (ClientConnection_Type == NULL) {
 			PyErr_SetNone(PyExc_TypeError);
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
+			Py_DECREF(py_base);
 			return NULL;
 		}
 
 		if (!PyObject_TypeCheck(py_basis, ClientConnection_Type)) {
 			PyErr_SetString(PyExc_TypeError, "basis_connection must be a DCE/RPC connection");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
+			Py_DECREF(py_base);
+			Py_DECREF(ClientConnection_Type);
 			return NULL;
 		}
 
@@ -178,6 +192,9 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (base_pipe == NULL) {
 			PyErr_NoMemory();
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
+			Py_DECREF(py_base);
+			Py_DECREF(ClientConnection_Type);
 			return NULL;
 		}
 
@@ -185,10 +202,15 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (!NT_STATUS_IS_OK(status)) {
 			PyErr_SetNTSTATUS(status);
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
+			Py_DECREF(py_base);
+			Py_DECREF(ClientConnection_Type);
 			return NULL;
 		}
 
 		ret->pipe = talloc_steal(ret->mem_ctx, ret->pipe);
+		Py_XDECREF(ClientConnection_Type);
+		Py_XDECREF(py_base);
 	} else {
 		struct tevent_context *event_ctx;
 		struct loadparm_context *lp_ctx;
@@ -198,6 +220,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (event_ctx == NULL) {
 			PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -205,6 +228,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (lp_ctx == NULL) {
 			PyErr_SetString(PyExc_TypeError, "Expected loadparm context");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -212,6 +236,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (credentials == NULL) {
 			PyErr_SetString(PyExc_TypeError, "Expected credentials");
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 		status = dcerpc_pipe_connect(ret->mem_ctx, &ret->pipe, binding_string,
@@ -219,6 +244,7 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
 		if (!NT_STATUS_IS_OK(status)) {
 			PyErr_SetNTSTATUS(status);
 			TALLOC_FREE(ret->mem_ctx);
+			Py_DECREF(ret);
 			return NULL;
 		}
 
@@ -378,6 +404,7 @@ PyObject *py_return_ndr_struct(const char *module_name, const char *type_name,
 
 	py_type = (PyTypeObject *)PyObject_GetAttrString(module, type_name);
 	if (py_type == NULL) {
+		Py_DECREF(module);
 		return NULL;
 	}
 
diff --git a/source4/param/provision.c b/source4/param/provision.c
index 153850667b1..ee84cd021e1 100644
--- a/source4/param/provision.c
+++ b/source4/param/provision.c
@@ -199,13 +199,15 @@ static PyObject *py_dom_sid_FromSid(struct dom_sid *sid)
 	PyObject *mod_security, *dom_sid_Type;
 
 	mod_security = PyImport_ImportModule("samba.dcerpc.security");
-	if (mod_security == NULL)
+	if (mod_security == NULL) {
 		return NULL;
-
+	}
 	dom_sid_Type = PyObject_GetAttrString(mod_security, "dom_sid");
-	if (dom_sid_Type == NULL)
+	if (dom_sid_Type == NULL) {
+		Py_DECREF(mod_security);
 		return NULL;
-
+	}
+	Py_DECREF(mod_security);
 	return pytalloc_reference((PyTypeObject *)dom_sid_Type, sid);
 }
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list