summaryrefslogtreecommitdiffstats
path: root/Modules
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 /Modules
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 'Modules')
-rw-r--r--Modules/fcntlmodule.c19
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;