(Merge 3.3) Issue #20113: os.readv() and os.writev() now raise an OSError

exception on error instead of returning -1.
This commit is contained in:
Victor Stinner 2014-01-08 15:26:12 +01:00
commit 149e540adf
4 changed files with 36 additions and 10 deletions

View file

@ -8011,14 +8011,14 @@ iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, int cnt, int type)
*iov = PyMem_New(struct iovec, cnt);
if (*iov == NULL) {
PyErr_NoMemory();
return total;
return -1;
}
*buf = PyMem_New(Py_buffer, cnt);
if (*buf == NULL) {
PyMem_Del(*iov);
PyErr_NoMemory();
return total;
return -1;
}
for (i = 0; i < cnt; i++) {
@ -8043,7 +8043,7 @@ fail:
PyBuffer_Release(&(*buf)[j]);
}
PyMem_Del(*buf);
return 0;
return -1;
}
static void
@ -8083,7 +8083,7 @@ posix_readv(PyObject *self, PyObject *args)
}
cnt = PySequence_Size(seq);
if (!iov_setup(&iov, &buf, seq, cnt, PyBUF_WRITABLE))
if (iov_setup(&iov, &buf, seq, cnt, PyBUF_WRITABLE) < 0)
return NULL;
Py_BEGIN_ALLOW_THREADS
@ -8091,6 +8091,9 @@ posix_readv(PyObject *self, PyObject *args)
Py_END_ALLOW_THREADS
iov_cleanup(iov, buf, cnt);
if (n < 0)
return posix_error();
return PyLong_FromSsize_t(n);
}
#endif
@ -8216,8 +8219,8 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
Py_ssize_t i = 0; /* Avoid uninitialized warning */
sf.hdr_cnt = PySequence_Size(headers);
if (sf.hdr_cnt > 0 &&
!(i = iov_setup(&(sf.headers), &hbuf,
headers, sf.hdr_cnt, PyBUF_SIMPLE)))
(i = iov_setup(&(sf.headers), &hbuf,
headers, sf.hdr_cnt, PyBUF_SIMPLE)) < 0)
return NULL;
#ifdef __APPLE__
sbytes += i;
@ -8233,8 +8236,8 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
Py_ssize_t i = 0; /* Avoid uninitialized warning */
sf.trl_cnt = PySequence_Size(trailers);
if (sf.trl_cnt > 0 &&
!(i = iov_setup(&(sf.trailers), &tbuf,
trailers, sf.trl_cnt, PyBUF_SIMPLE)))
(i = iov_setup(&(sf.trailers), &tbuf,
trailers, sf.trl_cnt, PyBUF_SIMPLE)) < 0)
return NULL;
#ifdef __APPLE__
sbytes += i;
@ -8475,7 +8478,7 @@ posix_writev(PyObject *self, PyObject *args)
}
cnt = PySequence_Size(seq);
if (!iov_setup(&iov, &buf, seq, cnt, PyBUF_SIMPLE)) {
if (iov_setup(&iov, &buf, seq, cnt, PyBUF_SIMPLE) < 0) {
return NULL;
}
@ -8484,6 +8487,9 @@ posix_writev(PyObject *self, PyObject *args)
Py_END_ALLOW_THREADS
iov_cleanup(iov, buf, cnt);
if (res < 0)
return posix_error();
return PyLong_FromSsize_t(res);
}
#endif