[Python-checkins] r84590 - in python/branches/release31-maint: Lib/test/test_ioctl.py Misc/NEWS Modules/fcntlmodule.c

antoine.pitrou python-checkins at python.org
Tue Sep 7 18:32:28 CEST 2010


Author: antoine.pitrou
Date: Tue Sep  7 18:32:28 2010
New Revision: 84590

Log:
Merged revisions 84589 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r84589 | antoine.pitrou | 2010-09-07 18:30:09 +0200 (mar., 07 sept. 2010) | 5 lines
  
  Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True,
  and the passed buffer was exactly 1024 bytes long, the buffer wouldn't
  be updated back after the system call.  Original patch by Brian Brazil.
........


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Lib/test/test_ioctl.py
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/Modules/fcntlmodule.c

Modified: python/branches/release31-maint/Lib/test/test_ioctl.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_ioctl.py	(original)
+++ python/branches/release31-maint/Lib/test/test_ioctl.py	Tue Sep  7 18:32:28 2010
@@ -1,3 +1,4 @@
+import array
 import unittest
 from test.support import run_unittest, import_module, get_attribute
 import os, struct
@@ -34,16 +35,36 @@
         rpgrp = struct.unpack("i", r)[0]
         self.assertTrue(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
 
-    def test_ioctl_mutate(self):
-        import array
-        buf = array.array('i', [0])
+    def _check_ioctl_mutate_len(self, nbytes=None):
+        buf = array.array('i')
+        intsize = buf.itemsize
         ids = (os.getpgrp(), os.getsid(0))
-        tty = open("/dev/tty", "r")
-        r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
+        # A fill value unlikely to be in `ids`
+        fill = -12345
+        if nbytes is not None:
+            # Extend the buffer so that it is exactly `nbytes` bytes long
+            buf.extend([fill] * (nbytes // intsize))
+            self.assertEqual(len(buf) * intsize, nbytes)   # sanity check
+        else:
+            buf.append(fill)
+        with open("/dev/tty", "r") as tty:
+            r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
         rpgrp = buf[0]
         self.assertEquals(r, 0)
         self.assertTrue(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
 
+    def test_ioctl_mutate(self):
+        self._check_ioctl_mutate_len()
+
+    def test_ioctl_mutate_1024(self):
+        # Issue #9758: a mutable buffer of exactly 1024 bytes wouldn't be
+        # copied back after the system call.
+        self._check_ioctl_mutate_len(1024)
+
+    def test_ioctl_mutate_2048(self):
+        # Test with a larger buffer, just for the record.
+        self._check_ioctl_mutate_len(2048)
+
     def test_ioctl_signed_unsigned_code_param(self):
         if not pty:
             raise unittest.SkipTest('pty module required')

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Tue Sep  7 18:32:28 2010
@@ -105,6 +105,10 @@
 Library
 -------
 
+- Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True,
+  and the passed buffer was exactly 1024 bytes long, the buffer wouldn't
+  be updated back after the system call.  Original patch by Brian Brazil.
+
 - Issue #6656: fix locale.format_string to handle escaped percents
   and mappings.
 

Modified: python/branches/release31-maint/Modules/fcntlmodule.c
==============================================================================
--- python/branches/release31-maint/Modules/fcntlmodule.c	(original)
+++ python/branches/release31-maint/Modules/fcntlmodule.c	Tue Sep  7 18:32:28 2010
@@ -157,7 +157,7 @@
         else {
             ret = ioctl(fd, code, arg);
         }
-        if (mutate_arg && (len < IOCTL_BUFSZ)) {
+        if (mutate_arg && (len <= IOCTL_BUFSZ)) {
             memcpy(str, buf, len);
         }
         PyBuffer_Release(&pstr); /* No further access to str below this point */


More information about the Python-checkins mailing list