]> granicus.if.org Git - python/commitdiff
Issue #9015, #9611: FileIO.readinto(), FileIO.write() and os.write() clamp the
authorVictor Stinner <victor.stinner@haypocalc.com>
Tue, 4 Jan 2011 00:29:35 +0000 (00:29 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Tue, 4 Jan 2011 00:29:35 +0000 (00:29 +0000)
length to 2^31-1 on Windows.

Misc/NEWS
Modules/_io/fileio.c
Modules/posixmodule.c

index 5df832dc4799addb6e4c100b3c1cba9d6a1eeaeb..1540db7ab82a261ee22fb49d895b5b032d425f61 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index 96fce15fef12302f24bd91a8d85fc8e67c31189a..23616361be1ef18aae7936e5214a409dbd6b064d 100644 (file)
@@ -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;
index d7891fa6c870257157783675816687740bbcc1bd..0cd6340cd48f1ea8762b1c1bb2ab08470ffc496a 100644 (file)
@@ -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)