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. ........
This commit is contained in:
parent
15db1443ae
commit
334e0dde1d
@ -1,3 +1,4 @@
|
|||||||
|
import array
|
||||||
import unittest
|
import unittest
|
||||||
from test.support import run_unittest, import_module, get_attribute
|
from test.support import run_unittest, import_module, get_attribute
|
||||||
import os, struct
|
import os, struct
|
||||||
@ -34,16 +35,36 @@ class IoctlTests(unittest.TestCase):
|
|||||||
rpgrp = struct.unpack("i", r)[0]
|
rpgrp = struct.unpack("i", r)[0]
|
||||||
self.assertTrue(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
|
self.assertTrue(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
|
||||||
|
|
||||||
def test_ioctl_mutate(self):
|
def _check_ioctl_mutate_len(self, nbytes=None):
|
||||||
import array
|
buf = array.array('i')
|
||||||
buf = array.array('i', [0])
|
intsize = buf.itemsize
|
||||||
ids = (os.getpgrp(), os.getsid(0))
|
ids = (os.getpgrp(), os.getsid(0))
|
||||||
tty = open("/dev/tty", "r")
|
# 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)
|
r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
|
||||||
rpgrp = buf[0]
|
rpgrp = buf[0]
|
||||||
self.assertEquals(r, 0)
|
self.assertEquals(r, 0)
|
||||||
self.assertTrue(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
|
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):
|
def test_ioctl_signed_unsigned_code_param(self):
|
||||||
if not pty:
|
if not pty:
|
||||||
raise unittest.SkipTest('pty module required')
|
raise unittest.SkipTest('pty module required')
|
||||||
|
@ -105,6 +105,10 @@ C-API
|
|||||||
Library
|
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
|
- Issue #6656: fix locale.format_string to handle escaped percents
|
||||||
and mappings.
|
and mappings.
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ fcntl_ioctl(PyObject *self, PyObject *args)
|
|||||||
else {
|
else {
|
||||||
ret = ioctl(fd, code, arg);
|
ret = ioctl(fd, code, arg);
|
||||||
}
|
}
|
||||||
if (mutate_arg && (len < IOCTL_BUFSZ)) {
|
if (mutate_arg && (len <= IOCTL_BUFSZ)) {
|
||||||
memcpy(str, buf, len);
|
memcpy(str, buf, len);
|
||||||
}
|
}
|
||||||
PyBuffer_Release(&pstr); /* No further access to str below this point */
|
PyBuffer_Release(&pstr); /* No further access to str below this point */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user