diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-01-04 00:29:35 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-01-04 00:29:35 (GMT) |
commit | e6edec23718072ed7903be9dae37ae330a9d81d5 (patch) | |
tree | dd43a4d1de61a8b0b49bef7f3fb299638f7aded9 | |
parent | 560f9dab55701654706b0d257d5d8f34f633bb52 (diff) | |
download | cpython-e6edec23718072ed7903be9dae37ae330a9d81d5.zip cpython-e6edec23718072ed7903be9dae37ae330a9d81d5.tar.gz cpython-e6edec23718072ed7903be9dae37ae330a9d81d5.tar.bz2 |
Issue #9015, #9611: FileIO.readinto(), FileIO.write() and os.write() clamp the
length to 2^31-1 on Windows.
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_io/fileio.c | 22 | ||||
-rw-r--r-- | Modules/posixmodule.c | 11 |
3 files changed, 30 insertions, 6 deletions
@@ -8,6 +8,9 @@ What's New in Python 3.2 Release Candidate 1 Core and Builtins ----------------- +- Issue #9015, #9611: FileIO.readinto(), FileIO.write() and os.write() clamp + the length to 2^31-1 on Windows. + - Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime() can now handle dates after 2038. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 96fce15..2361636 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -506,7 +506,7 @@ static PyObject * fileio_readinto(fileio *self, PyObject *args) { Py_buffer pbuf; - Py_ssize_t n; + Py_ssize_t n, len; if (self->fd < 0) return err_closed(); @@ -517,9 +517,16 @@ fileio_readinto(fileio *self, PyObject *args) return NULL; if (_PyVerify_fd(self->fd)) { + len = pbuf.len; Py_BEGIN_ALLOW_THREADS errno = 0; - n = read(self->fd, pbuf.buf, pbuf.len); +#if defined(MS_WIN64) || defined(MS_WINDOWS) + if (len > INT_MAX) + len = INT_MAX; + n = read(self->fd, pbuf.buf, (int)len); +#else + n = read(self->fd, pbuf.buf, (size_t)len); +#endif Py_END_ALLOW_THREADS } else n = -1; @@ -685,7 +692,7 @@ static PyObject * fileio_write(fileio *self, PyObject *args) { Py_buffer pbuf; - Py_ssize_t n; + Py_ssize_t n, len; if (self->fd < 0) return err_closed(); @@ -698,7 +705,14 @@ fileio_write(fileio *self, PyObject *args) if (_PyVerify_fd(self->fd)) { Py_BEGIN_ALLOW_THREADS errno = 0; - n = write(self->fd, pbuf.buf, pbuf.len); + len = pbuf.len; +#if defined(MS_WIN64) || defined(MS_WINDOWS) + if (len > INT_MAX) + len = INT_MAX; + n = write(self->fd, pbuf.buf, (int)len); +#else + n = write(self->fd, pbuf.buf, (size_t)len); +#endif Py_END_ALLOW_THREADS } else n = -1; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d7891fa..0cd6340 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5696,7 +5696,7 @@ posix_write(PyObject *self, PyObject *args) { Py_buffer pbuf; int fd; - Py_ssize_t size; + Py_ssize_t size, len; if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf)) return NULL; @@ -5704,8 +5704,15 @@ posix_write(PyObject *self, PyObject *args) PyBuffer_Release(&pbuf); return posix_error(); } + len = pbuf.len; Py_BEGIN_ALLOW_THREADS - size = write(fd, pbuf.buf, (size_t)pbuf.len); +#if defined(MS_WIN64) || defined(MS_WINDOWS) + if (len > INT_MAX) + len = INT_MAX; + size = write(fd, pbuf.buf, (int)len); +#else + size = write(fd, pbuf.buf, (size_t)len); +#endif Py_END_ALLOW_THREADS PyBuffer_Release(&pbuf); if (size < 0) |