diff options
author | Simon Graham <simon.graham@seequent.com> | 2020-10-22 14:07:40 +1300 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2020-11-14 16:35:51 -0700 |
commit | bb572db23526ad7b3b91723826e43fe304a472ef (patch) | |
tree | e7da33b023195a44ea79e9224242f3f71d0fbf03 | |
parent | d71148a0d11eb0b2b1e0f2bdd367254c2491642b (diff) | |
download | numpy-bb572db23526ad7b3b91723826e43fe304a472ef.tar.gz |
BUG: Made array_tofile exception safe.
-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 74bb5bc95..41564bdf4 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -621,29 +621,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; |