summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorSimon Graham <simon.graham@seequent.com>2020-10-22 14:07:40 +1300
committerSimon Graham <simon.graham@seequent.com>2020-10-29 15:31:07 +1300
commitc44473910a9149a90be71dd581c7f1c32d1d57d5 (patch)
treedd78c41961eab3bb657a8142dd731b8d3f176780 /numpy
parent05a71f1d6feafddfec38d20d2f30d0ff361811a1 (diff)
downloadnumpy-c44473910a9149a90be71dd581c7f1c32d1d57d5.tar.gz
BUG: Made array_tofile exception safe.
Diffstat (limited to 'numpy')
-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 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;