From 47dd2f0aa411350cbf547e0cdbf7a812f4db9467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Robert?= Date: Fri, 3 Apr 2026 11:04:32 +0200 Subject: [PATCH 1/2] BUG: fix memory leaks in `init_iter_all` when called on non C-contiguous arrays --- bottleneck/src/iterators.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/bottleneck/src/iterators.h b/bottleneck/src/iterators.h index 9cc4bb973..3ae621ef0 100644 --- a/bottleneck/src/iterators.h +++ b/bottleneck/src/iterators.h @@ -72,7 +72,7 @@ init_iter_one(iter *it, PyArrayObject *a, int axis) * calling Py_DECREF(it.a_ravel) after you are done with the iterator. * See nanargmin for an example. */ -static inline void +static inline int init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) { int i, j = 0; @@ -129,22 +129,30 @@ init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) } } else { it->ndim_m2 = -1; + PyArrayObject *tmp = NULL; if (anyorder) { - a = (PyArrayObject *)PyArray_Ravel(a, NPY_ANYORDER); + tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_ANYORDER); } else { - a = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); + tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } + Py_DECREF(a); + if (tmp == NULL) return -1; + a = tmp; it->a_ravel = a; it->length = PyArray_DIM(a, 0); it->astride = PyArray_STRIDE(a, 0); } } else if (ravel) { it->ndim_m2 = -1; + PyArrayObject *tmp = NULL; if (anyorder) { - a = (PyArrayObject *)PyArray_Ravel(a, NPY_ANYORDER); + tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_ANYORDER); } else { - a = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); + tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } + Py_DECREF(a); + if (tmp == NULL) return -1; + a = tmp; it->a_ravel = a; it->length = PyArray_DIM(a, 0); it->astride = PyArray_STRIDE(a, 0); @@ -171,6 +179,7 @@ init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) it->stride = it->astride / item_size; it->pa = PyArray_BYTES(a); + return 0; } #define NEXT \ From 753c0ec85154bafdd6a2b0923a25fd4f7b16fdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Robert?= Date: Fri, 3 Apr 2026 11:25:14 +0200 Subject: [PATCH 2/2] fixup! BUG: fix memory leaks in `init_iter_all` when called on non C-contiguous arrays --- bottleneck/src/iterators.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bottleneck/src/iterators.h b/bottleneck/src/iterators.h index 3ae621ef0..40e91897c 100644 --- a/bottleneck/src/iterators.h +++ b/bottleneck/src/iterators.h @@ -135,7 +135,7 @@ init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) } else { tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } - Py_DECREF(a); + //Py_DECREF(a); if (tmp == NULL) return -1; a = tmp; it->a_ravel = a; @@ -150,7 +150,7 @@ init_iter_all(iter *it, PyArrayObject *a, int ravel, int anyorder) } else { tmp = (PyArrayObject *)PyArray_Ravel(a, NPY_CORDER); } - Py_DECREF(a); + //Py_DECREF(a); if (tmp == NULL) return -1; a = tmp; it->a_ravel = a;