summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2020-10-02 20:46:10 -0600
committerGitHub <noreply@github.com>2020-10-02 20:46:10 -0600
commit565fe77f9ed8ed5720b42ddc3dc30947a1f3e9ae (patch)
tree7f4f9d134a448600a104d20a44c618a5bb0f3561
parent47a918f644da4ed3947ee2f797c790027041f29b (diff)
parentf632c948ff954892acda4d7849b8aa0e632c0a25 (diff)
downloadnumpy-565fe77f9ed8ed5720b42ddc3dc30947a1f3e9ae.tar.gz
Merge pull request #17430 from seberg/fix-memory-leak-nep37
BUG: Fix memoryleaks related to NEP 37 function overrides
-rw-r--r--numpy/core/src/multiarray/arrayfunction_override.c4
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c2
2 files changed, 6 insertions, 0 deletions
diff --git a/numpy/core/src/multiarray/arrayfunction_override.c b/numpy/core/src/multiarray/arrayfunction_override.c
index 613fe6b3f..8e3bde78f 100644
--- a/numpy/core/src/multiarray/arrayfunction_override.c
+++ b/numpy/core/src/multiarray/arrayfunction_override.c
@@ -388,15 +388,18 @@ array_implement_c_array_function_creation(
PyObject *numpy_module = PyImport_Import(npy_ma_str_numpy);
if (numpy_module == NULL) {
+ Py_DECREF(relevant_args);
return NULL;
}
PyObject *public_api = PyObject_GetAttrString(numpy_module, function_name);
Py_DECREF(numpy_module);
if (public_api == NULL) {
+ Py_DECREF(relevant_args);
return NULL;
}
if (!PyCallable_Check(public_api)) {
+ Py_DECREF(relevant_args);
Py_DECREF(public_api);
return PyErr_Format(PyExc_RuntimeError,
"numpy.%s is not callable.",
@@ -406,6 +409,7 @@ array_implement_c_array_function_creation(
PyObject* result = array_implement_array_function_internal(
public_api, relevant_args, args, kwargs);
+ Py_DECREF(relevant_args);
Py_DECREF(public_api);
return result;
}
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index ff2b796d2..1aad70dc6 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -2296,6 +2296,7 @@ array_fromiter(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds)
array_function_result = array_implement_c_array_function_creation(
"fromiter", args, keywds);
if (array_function_result != Py_NotImplemented) {
+ Py_DECREF(descr);
return array_function_result;
}
@@ -2942,6 +2943,7 @@ array_arange(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *kws) {
array_function_result = array_implement_c_array_function_creation(
"arange", args, kws);
if (array_function_result != Py_NotImplemented) {
+ Py_XDECREF(typecode);
return array_function_result;
}