summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_ioctl.py
diff options
context:
space:
mode:
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 07dac09..6c7ab0c 100644
--- a/Lib/test/test_ioctl.py
+++ b/Lib/test/test_ioctl.py
@@ -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 @@ 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')