]> granicus.if.org Git - python/commitdiff
Issue #9015, #9611: stdprinter.write() clamps the length to 2^31-1 on Windows
authorVictor Stinner <victor.stinner@haypocalc.com>
Tue, 4 Jan 2011 13:15:39 +0000 (13:15 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Tue, 4 Jan 2011 13:15:39 +0000 (13:15 +0000)
Misc/NEWS
Objects/fileobject.c

index bebe16b9b525ef4e8bbb81339a1545deeadaf2d5..2c5df9e0ab73aa861f5ec1c756ddbd3cc8d33937 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,8 +12,8 @@ Core and Builtins
   doesn't have PY_SSIZE_T_CLEAN define and the size doesn't fit in an int
   (length bigger than 2^31-1 bytes).
 
-- Issue #9015, #9611: FileIO.readinto(), FileIO.write() and os.write() clamp
-  the length to 2^31-1 on Windows.
+- Issue #9015, #9611: FileIO.readinto(), FileIO.write(), os.write() and
+  stdprinter.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 9288e35b70dbe64bb9532fa529ac23f9a04860af..d20f196b276cfcef78f2cffe45f2618c96faa771 100644 (file)
@@ -344,7 +344,7 @@ stdprinter_new(PyTypeObject *type, PyObject *args, PyObject *kews)
 }
 
 static int
-fileio_init(PyObject *self, PyObject *args, PyObject *kwds)
+stdprinter_init(PyObject *self, PyObject *args, PyObject *kwds)
 {
     PyErr_SetString(PyExc_TypeError,
                     "cannot create 'stderrprinter' instances");
@@ -390,7 +390,13 @@ stdprinter_write(PyStdPrinter_Object *self, PyObject *args)
 
     Py_BEGIN_ALLOW_THREADS
     errno = 0;
+#if defined(MS_WIN64) || defined(MS_WINDOWS)
+    if (n > INT_MAX)
+        n = INT_MAX;
+    n = write(self->fd, c, (int)n);
+#else
     n = write(self->fd, c, n);
+#endif
     Py_END_ALLOW_THREADS
 
     if (n < 0) {
@@ -509,7 +515,7 @@ PyTypeObject PyStdPrinter_Type = {
     0,                                          /* tp_descr_get */
     0,                                          /* tp_descr_set */
     0,                                          /* tp_dictoffset */
-    fileio_init,                                /* tp_init */
+    stdprinter_init,                            /* tp_init */
     PyType_GenericAlloc,                        /* tp_alloc */
     stdprinter_new,                             /* tp_new */
     PyObject_Del,                               /* tp_free */