summaryrefslogtreecommitdiff
path: root/Lib/test/test_ioctl.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-09-07 16:34:47 +0000
committerAntoine Pitrou <solipsis@pitrou.net>2010-09-07 16:34:47 +0000
commitf4f6171bc0de3eefb94d49aa5f8d8e85700d7478 (patch)
tree225b865901b2303db51c8f0318253ac42edc9a64 /Lib/test/test_ioctl.py
parent857298100b9a5fa5bbcafb2ff578418bc6750e58 (diff)
downloadcpython-git-f4f6171bc0de3eefb94d49aa5f8d8e85700d7478.tar.gz
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. ........
Diffstat (limited to 'Lib/test/test_ioctl.py')
-rw-r--r--Lib/test/test_ioctl.py31
1 files changed, 26 insertions, 5 deletions
diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py
index 51da6a3181..48857dfb2a 100644
--- a/Lib/test/test_ioctl.py
+++ b/Lib/test/test_ioctl.py
@@ -1,3 +1,4 @@
+import array
import unittest
from test.test_support import run_unittest, import_module, get_attribute
import os, struct
@@ -34,16 +35,36 @@ class IoctlTests(unittest.TestCase):
rpgrp = struct.unpack("i", r)[0]
self.assertIn(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.assertIn(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')