mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
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:
commit
ab0e9f7089
7 changed files with 33 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue