summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Graham <simon.graham@seequent.com>2020-10-22 14:07:40 +1300
committerCharles Harris <charlesr.harris@gmail.com>2020-11-14 16:35:51 -0700
commitbb572db23526ad7b3b91723826e43fe304a472ef (patch)
treee7da33b023195a44ea79e9224242f3f71d0fbf03
parentd71148a0d11eb0b2b1e0f2bdd367254c2491642b (diff)
downloadnumpy-bb572db23526ad7b3b91723826e43fe304a472ef.tar.gz
BUG: Made array_tofile exception safe.
-rw-r--r--numpy/core/src/multiarray/methods.c30
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;