summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-01-08 14:21:28 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-01-08 14:21:28 (GMT)
commit57ddf78b6b18d9da6f466b4e6da0437c3271196e (patch)
treecf55257edc004a09f62e19d67668e30634f17712 /Modules
parent2bcbc141173e5cd2ed36693a71bed8d5a1a54dd4 (diff)
downloadcpython-57ddf78b6b18d9da6f466b4e6da0437c3271196e.zip
cpython-57ddf78b6b18d9da6f466b4e6da0437c3271196e.tar.gz
cpython-57ddf78b6b18d9da6f466b4e6da0437c3271196e.tar.bz2
Issue #20113: os.readv() and os.writev() now raise an OSError exception on
error instead of returning -1.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/posixmodule.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index f97d70b..c00ca20 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -8050,14 +8050,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++) {
@@ -8082,7 +8082,7 @@ fail:
PyBuffer_Release(&(*buf)[j]);
}
PyMem_Del(*buf);
- return 0;
+ return -1;
}
static void
@@ -8122,7 +8122,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
@@ -8130,6 +8130,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
@@ -8254,8 +8257,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;
@@ -8271,8 +8274,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;
@@ -8483,7 +8486,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;
}
@@ -8492,6 +8495,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