diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2014-04-02 19:38:36 -0600 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2014-04-02 19:38:36 -0600 |
commit | 6c6ddaf62e0556919a57d510e13ccb2e6cd6e043 (patch) | |
tree | 177f6dbf3bdf81c6cfcd74c5e5979f2b45309c55 /numpy | |
parent | 3e61f8626e8dd22ae6627c276963dbe85e0a40ae (diff) | |
parent | 3c94550789ba2328ebcd2faaa51c873dc3f1852c (diff) | |
download | numpy-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.c | 1 | ||||
-rw-r--r-- | numpy/core/src/multiarray/conversion_utils.c | 9 | ||||
-rw-r--r-- | numpy/core/src/multiarray/datetime_busdaycal.c | 7 | ||||
-rw-r--r-- | numpy/core/src/multiarray/descriptor.c | 3 | ||||
-rw-r--r-- | numpy/core/src/multiarray/getset.c | 1 | ||||
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 6 | ||||
-rw-r--r-- | numpy/core/src/multiarray/nditer_pywrap.c | 4 | ||||
-rw-r--r-- | numpy/core/tests/test_item_selection.py | 5 | ||||
-rw-r--r-- | numpy/core/tests/test_multiarray.py | 12 |
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) |