summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2008-03-19 23:03:25 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2008-03-19 23:03:25 (GMT)
commita5cfcad0e35e394adb5d25a5f5fbc3065fea5b85 (patch)
tree3f7fe7e5325a12965f5e450b8132abac7c873ef5 /Lib
parent48581c5f08d368942840f99687fce7f10758fa7c (diff)
downloadcpython-a5cfcad0e35e394adb5d25a5f5fbc3065fea5b85.zip
cpython-a5cfcad0e35e394adb5d25a5f5fbc3065fea5b85.tar.gz
cpython-a5cfcad0e35e394adb5d25a5f5fbc3065fea5b85.tar.bz2
Prevent ioctl op codes from being sign extended from int to unsigned long
when used on platforms that actually define ioctl as taking an unsigned long. (the BSDs and OS X / Darwin) Adds a unittest for fcntl.ioctl that tests what happens with both positive and negative numbers. This was done because of issue1471 but I'm not able to reproduce -that- problem in the first place on Linux 32bit or 64bit or OS X 10.4 & 10.5 32bit or 64 bit.
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/test/test_fcntl.py29
1 files changed, 28 insertions, 1 deletions
diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index feed870..08b59ec 100755
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -5,12 +5,18 @@ OS/2+EMX doesn't support the file locking operations.
"""
import struct
import fcntl
-import os, sys
+import os
+import struct
+import sys
import unittest
from test.test_support import verbose, TESTFN, unlink, run_unittest
# TODO - Write tests for ioctl(), flock() and lockf().
+try:
+ import termios
+except ImportError:
+ termios = None
def get_lockdata():
if sys.platform.startswith('atheos'):
@@ -82,8 +88,29 @@ class TestFcntl(unittest.TestCase):
self.f.close()
+class TestIoctl(unittest.TestCase):
+ if termios:
+ def test_ioctl_signed_unsigned_code_param(self):
+ if termios.TIOCSWINSZ < 0:
+ set_winsz_opcode_maybe_neg = termios.TIOCSWINSZ
+ set_winsz_opcode_pos = termios.TIOCSWINSZ & 0xffffffffL
+ else:
+ set_winsz_opcode_pos = termios.TIOCSWINSZ
+ set_winsz_opcode_maybe_neg, = struct.unpack("i",
+ struct.pack("I", termios.TIOCSWINSZ))
+
+ # We're just testing that these calls do not raise exceptions.
+ saved_winsz = fcntl.ioctl(0, termios.TIOCGWINSZ, "\0"*8)
+ our_winsz = struct.pack("HHHH",80,25,0,0)
+ # test both with a positive and potentially negative ioctl code
+ new_winsz = fcntl.ioctl(0, set_winsz_opcode_pos, our_winsz)
+ new_winsz = fcntl.ioctl(0, set_winsz_opcode_maybe_neg, our_winsz)
+ fcntl.ioctl(0, set_winsz_opcode_maybe_neg, saved_winsz)
+
+
def test_main():
run_unittest(TestFcntl)
+ run_unittest(TestIoctl)
if __name__ == '__main__':
test_main()