diff options
| author | Simon Graham <simon.graham@seequent.com> | 2020-10-22 14:07:40 +1300 |
|---|---|---|
| committer | Simon Graham <simon.graham@seequent.com> | 2020-10-29 15:31:07 +1300 |
| commit | c44473910a9149a90be71dd581c7f1c32d1d57d5 (patch) | |
| tree | dd78c41961eab3bb657a8142dd731b8d3f176780 /numpy | |
| parent | 05a71f1d6feafddfec38d20d2f30d0ff361811a1 (diff) | |
| download | numpy-c44473910a9149a90be71dd581c7f1c32d1d57d5.tar.gz | |
BUG: Made array_tofile exception safe.
Diffstat (limited to 'numpy')
| -rw-r--r-- | numpy/core/src/multiarray/methods.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index 749959534..1b7f927fc 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -616,29 +616,33 @@ array_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds) } fd = npy_PyFile_Dup2(file, "wb", &orig_pos); - if (fd == NULL) { - Py_DECREF(file); - return NULL; - } - - int res_write = PyArray_ToFile(self, fd, sep, format); PyObject *err_type, *err_value, *err_traceback; - PyErr_Fetch(&err_type, &err_value, &err_traceback); + int failed = 0; - int res_close = npy_PyFile_DupClose2(file, fd, orig_pos); - if (res_close < 0) { + if (fd != NULL) { + if (PyArray_ToFile(self, fd, sep, format) < 0) { + failed = 1; + } + PyErr_Fetch(&err_type, &err_value, &err_traceback); + if (npy_PyFile_DupClose2(file, fd, orig_pos) < 0) { + failed = 1; + } npy_PyErr_ChainExceptions(err_type, err_value, err_traceback); + } else { + failed = 1; } - if (own && npy_PyFile_CloseFile(file) < 0) { + if (own) { + PyErr_Fetch(&err_type, &err_value, &err_traceback); + if (npy_PyFile_CloseFile(file) < 0) { + failed = 1; + } npy_PyErr_ChainExceptions(err_type, err_value, err_traceback); - res_close = -1; } - PyErr_Restore(err_type, err_value, err_traceback); Py_DECREF(file); - if (res_write < 0 || res_close < 0) { + if (failed) { return NULL; } Py_RETURN_NONE; |
