summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2014-04-02 19:38:36 -0600
committerCharles Harris <charlesr.harris@gmail.com>2014-04-02 19:38:36 -0600
commit6c6ddaf62e0556919a57d510e13ccb2e6cd6e043 (patch)
tree177f6dbf3bdf81c6cfcd74c5e5979f2b45309c55 /numpy
parent3e61f8626e8dd22ae6627c276963dbe85e0a40ae (diff)
parent3c94550789ba2328ebcd2faaa51c873dc3f1852c (diff)
downloadnumpy-6c6ddaf62e0556919a57d510e13ccb2e6cd6e043.tar.gz
Merge pull request #4578 from juliantaylor/static-bugs
BUG: fix memory leaks and missing NULL checks
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/buffer.c1
-rw-r--r--numpy/core/src/multiarray/conversion_utils.c9
-rw-r--r--numpy/core/src/multiarray/datetime_busdaycal.c7
-rw-r--r--numpy/core/src/multiarray/descriptor.c3
-rw-r--r--numpy/core/src/multiarray/getset.c1
-rw-r--r--numpy/core/src/multiarray/methods.c6
-rw-r--r--numpy/core/src/multiarray/nditer_pywrap.c4
-rw-r--r--numpy/core/tests/test_item_selection.py5
-rw-r--r--numpy/core/tests/test_multiarray.py12
9 files changed, 42 insertions, 6 deletions
diff --git a/numpy/core/src/multiarray/buffer.c b/numpy/core/src/multiarray/buffer.c
index b59729822..ea1a885ed 100644
--- a/numpy/core/src/multiarray/buffer.c
+++ b/numpy/core/src/multiarray/buffer.c
@@ -842,6 +842,7 @@ _descriptor_from_pep3118_format(char *s)
PyErr_Format(PyExc_RuntimeError,
"internal error: numpy.core._internal._dtype_from_pep3118 "
"did not return a valid dtype, got %s", buf);
+ Py_DECREF(descr);
free(buf);
return NULL;
}
diff --git a/numpy/core/src/multiarray/conversion_utils.c b/numpy/core/src/multiarray/conversion_utils.c
index d852229ac..b84dff864 100644
--- a/numpy/core/src/multiarray/conversion_utils.c
+++ b/numpy/core/src/multiarray/conversion_utils.c
@@ -395,6 +395,9 @@ PyArray_SortkindConverter(PyObject *obj, NPY_SORTKIND *sortkind)
if (PyUnicode_Check(obj)) {
obj = tmp = PyUnicode_AsASCIIString(obj);
+ if (obj == NULL) {
+ return NPY_FAIL;
+ }
}
*sortkind = NPY_QUICKSORT;
@@ -440,6 +443,9 @@ PyArray_SelectkindConverter(PyObject *obj, NPY_SELECTKIND *selectkind)
if (PyUnicode_Check(obj)) {
obj = tmp = PyUnicode_AsASCIIString(obj);
+ if (obj == NULL) {
+ return NPY_FAIL;
+ }
}
*selectkind = NPY_INTROSELECT;
@@ -591,6 +597,9 @@ PyArray_ClipmodeConverter(PyObject *object, NPY_CLIPMODE *val)
PyObject *tmp;
int ret;
tmp = PyUnicode_AsASCIIString(object);
+ if (tmp == NULL) {
+ return NPY_FAIL;
+ }
ret = PyArray_ClipmodeConverter(tmp, val);
Py_DECREF(tmp);
return ret;
diff --git a/numpy/core/src/multiarray/datetime_busdaycal.c b/numpy/core/src/multiarray/datetime_busdaycal.c
index 67ab5284c..91ba24c97 100644
--- a/numpy/core/src/multiarray/datetime_busdaycal.c
+++ b/numpy/core/src/multiarray/datetime_busdaycal.c
@@ -158,12 +158,10 @@ invalid_weekmask_string:
}
else {
int i;
- PyObject *f;
for (i = 0; i < 7; ++i) {
long val;
-
- f = PySequence_GetItem(obj, i);
+ PyObject *f = PySequence_GetItem(obj, i);
if (f == NULL) {
Py_DECREF(obj);
return 0;
@@ -171,6 +169,7 @@ invalid_weekmask_string:
val = PyInt_AsLong(f);
if (val == -1 && PyErr_Occurred()) {
+ Py_DECREF(f);
Py_DECREF(obj);
return 0;
}
@@ -184,9 +183,11 @@ invalid_weekmask_string:
PyErr_SetString(PyExc_ValueError,
"A business day weekmask array must have all "
"1's and 0's");
+ Py_DECREF(f);
Py_DECREF(obj);
return 0;
}
+ Py_DECREF(f);
}
goto finish;
diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c
index b7a8f11ef..46419e48f 100644
--- a/numpy/core/src/multiarray/descriptor.c
+++ b/numpy/core/src/multiarray/descriptor.c
@@ -63,7 +63,7 @@ _arraydescr_fromctypes(PyObject *obj)
/* derived type */
PyObject *newtup;
PyArray_Descr *derived;
- newtup = Py_BuildValue("NO", newdescr, length);
+ newtup = Py_BuildValue("NN", newdescr, length);
ret = PyArray_DescrConverter(newtup, &derived);
Py_DECREF(newtup);
if (ret == NPY_SUCCEED) {
@@ -706,6 +706,7 @@ _convert_from_commastring(PyObject *obj, int align)
if (!PyList_Check(listobj) || PyList_GET_SIZE(listobj) < 1) {
PyErr_SetString(PyExc_RuntimeError,
"_commastring is not returning a list with len >= 1");
+ Py_DECREF(listobj);
return NULL;
}
if (PyList_GET_SIZE(listobj) == 1) {
diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c
index 6ad4cc13a..182942ac9 100644
--- a/numpy/core/src/multiarray/getset.c
+++ b/numpy/core/src/multiarray/getset.c
@@ -267,6 +267,7 @@ array_interface_get(PyArrayObject *self)
}
if (array_might_be_written(self) < 0) {
+ Py_DECREF(dict);
return NULL;
}
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c
index b68745085..abfa04cb6 100644
--- a/numpy/core/src/multiarray/methods.c
+++ b/numpy/core/src/multiarray/methods.c
@@ -65,8 +65,9 @@ get_forwarding_ndarray_method(const char *name)
"NumPy internal error: could not find function "
"numpy.core._methods.%s", name);
}
-
- Py_INCREF(callable);
+ else {
+ Py_INCREF(callable);
+ }
Py_DECREF(module_methods);
return callable;
}
@@ -1823,6 +1824,7 @@ PyArray_Dump(PyObject *self, PyObject *file, int protocol)
if (PyBytes_Check(file) || PyUnicode_Check(file)) {
file = npy_PyFile_OpenFile(file, "wb");
if (file == NULL) {
+ Py_DECREF(cpick);
return -1;
}
}
diff --git a/numpy/core/src/multiarray/nditer_pywrap.c b/numpy/core/src/multiarray/nditer_pywrap.c
index 1ca5de8d6..7e40377b2 100644
--- a/numpy/core/src/multiarray/nditer_pywrap.c
+++ b/numpy/core/src/multiarray/nditer_pywrap.c
@@ -1547,6 +1547,9 @@ static PyObject *npyiter_multi_index_get(NewNpyArrayIterObject *self)
ndim = NpyIter_GetNDim(self->iter);
self->get_multi_index(self->iter, multi_index);
ret = PyTuple_New(ndim);
+ if (ret == NULL) {
+ return NULL;
+ }
for (idim = 0; idim < ndim; ++idim) {
PyTuple_SET_ITEM(ret, idim,
PyInt_FromLong(multi_index[idim]));
@@ -1605,6 +1608,7 @@ npyiter_multi_index_set(NewNpyArrayIterObject *self, PyObject *value)
PyObject *v = PySequence_GetItem(value, idim);
multi_index[idim] = PyInt_AsLong(v);
if (multi_index[idim]==-1 && PyErr_Occurred()) {
+ Py_XDECREF(v);
return -1;
}
}
diff --git a/numpy/core/tests/test_item_selection.py b/numpy/core/tests/test_item_selection.py
index e501588c9..d8e9e6fd0 100644
--- a/numpy/core/tests/test_item_selection.py
+++ b/numpy/core/tests/test_item_selection.py
@@ -60,6 +60,11 @@ class TestTake(TestCase):
del a
assert_(all(sys.getrefcount(o) == 3 for o in objects))
+ def test_unicode_mode(self):
+ d = np.arange(10)
+ k = b'\xc3\xa4'.decode("UTF8")
+ assert_raises(ValueError, d.take, 5, mode=k)
+
if __name__ == "__main__":
run_module_suite()
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 729295398..51e4fc650 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -1029,6 +1029,12 @@ class TestMethods(TestCase):
a = np.array(['aaaaaaaaa' for i in range(100)], dtype=np.unicode)
assert_equal(a.argsort(kind='m'), r)
+ def test_sort_unicode_kind(self):
+ d = np.arange(10)
+ k = b'\xc3\xa4'.decode("UTF8")
+ assert_raises(ValueError, d.sort, kind=k)
+ assert_raises(ValueError, d.argsort, kind=k)
+
def test_searchsorted(self):
# test for floats and complex containing nans. The logic is the
# same for all float types so only test double types for now.
@@ -1534,6 +1540,12 @@ class TestMethods(TestCase):
assert_equal(np.partition(d, k)[k], tgt[k])
assert_equal(d[np.argpartition(d, k)][k], tgt[k])
+ def test_partition_unicode_kind(self):
+ d = np.arange(10)
+ k = b'\xc3\xa4'.decode("UTF8")
+ assert_raises(ValueError, d.partition, 2, kind=k)
+ assert_raises(ValueError, d.argpartition, 2, kind=k)
+
def test_flatten(self):
x0 = np.array([[1, 2, 3], [4, 5, 6]], np.int32)