diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2008-03-19 23:03:25 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2008-03-19 23:03:25 (GMT) |
commit | a5cfcad0e35e394adb5d25a5f5fbc3065fea5b85 (patch) | |
tree | 3f7fe7e5325a12965f5e450b8132abac7c873ef5 /Modules/fcntlmodule.c | |
parent | 48581c5f08d368942840f99687fce7f10758fa7c (diff) | |
download | cpython-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 'Modules/fcntlmodule.c')
-rw-r--r-- | Modules/fcntlmodule.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 1e4a254..96a6cc8 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -97,11 +97,20 @@ fcntl_ioctl(PyObject *self, PyObject *args) { #define IOCTL_BUFSZ 1024 int fd; - /* In PyArg_ParseTuple below, use the unsigned int 'I' format for - the signed int 'code' variable, because Python turns 0x8000000 - into a large positive number (PyLong, or PyInt on 64-bit - platforms,) whereas C expects it to be a negative int */ - int code; + /* In PyArg_ParseTuple below, we use the unsigned non-checked 'I' + format for the 'code' parameter because Python turns 0x8000000 + into either a large positive number (PyLong or PyInt on 64-bit + platforms) or a negative number on others (32-bit PyInt) + whereas the system expects it to be a 32bit bit field value + regardless of it being passed as an int or unsigned long on + various platforms. See the termios.TIOCSWINSZ constant across + platforms for an example of thise. + + If any of the 64bit platforms ever decide to use more than 32bits + in their unsigned long ioctl codes this will break and need + special casing based on the platform being built on. + */ + unsigned int code; int arg; int ret; char *str; |