Issue #10350: Read and save errno before calling a function which might overwrite it.

Original patch by Hallvard B Furuseth.
This commit is contained in:
Antoine Pitrou 2011-12-16 12:29:37 +01:00
commit ab0e9f7089
7 changed files with 33 additions and 12 deletions

View file

@ -530,6 +530,7 @@ fileio_readinto(fileio *self, PyObject *args)
{
Py_buffer pbuf;
Py_ssize_t n, len;
int err;
if (self->fd < 0)
return err_closed();
@ -553,10 +554,12 @@ fileio_readinto(fileio *self, PyObject *args)
Py_END_ALLOW_THREADS
} else
n = -1;
err = errno;
PyBuffer_Release(&pbuf);
if (n < 0) {
if (errno == EAGAIN)
if (err == EAGAIN)
Py_RETURN_NONE;
errno = err;
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
@ -726,9 +729,11 @@ fileio_read(fileio *self, PyObject *args)
n = -1;
if (n < 0) {
int err = errno;
Py_DECREF(bytes);
if (errno == EAGAIN)
if (err == EAGAIN)
Py_RETURN_NONE;
errno = err;
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
@ -748,6 +753,7 @@ fileio_write(fileio *self, PyObject *args)
{
Py_buffer pbuf;
Py_ssize_t n, len;
int err;
if (self->fd < 0)
return err_closed();
@ -778,12 +784,14 @@ fileio_write(fileio *self, PyObject *args)
Py_END_ALLOW_THREADS
} else
n = -1;
err = errno;
PyBuffer_Release(&pbuf);
if (n < 0) {
if (errno == EAGAIN)
if (err == EAGAIN)
Py_RETURN_NONE;
errno = err;
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}