[Python-checkins] r45909 - in python/branches/release24-maint: Lib/test/test_pty.py Misc/ACKS Modules/fcntlmodule.c

thomas.wouters python-checkins at python.org
Fri May 5 12:52:44 CEST 2006


Author: thomas.wouters
Date: Fri May  5 12:52:43 2006
New Revision: 45909

Modified:
   python/branches/release24-maint/Lib/test/test_pty.py
   python/branches/release24-maint/Misc/ACKS
   python/branches/release24-maint/Modules/fcntlmodule.c
Log:

Backport SF bug/patch #1433877: string parameter to ioctl not null terminated

The new char-array used in ioctl calls wasn't explicitly NUL-terminated;
quite probably the cause for the test_pty failures on Solaris that we
circumvented earlier.



Modified: python/branches/release24-maint/Lib/test/test_pty.py
==============================================================================
--- python/branches/release24-maint/Lib/test/test_pty.py	(original)
+++ python/branches/release24-maint/Lib/test/test_pty.py	Fri May  5 12:52:43 2006
@@ -4,13 +4,6 @@
 TEST_STRING_1 = "I wish to buy a fish license.\n"
 TEST_STRING_2 = "For my pet fish, Eric.\n"
 
-# Solaris (at least 2.9 and 2.10) seem to have a fickle isatty(). The first
-# test below, testing the result of os.openpty() for tty-ness, sometimes
-# (but not always) fails. The second isatty test, in the sub-process, always
-# works. Allow that fickle first test to fail on these platforms, since it
-# doesn't actually affect functionality.
-fickle_isatty = ["sunos5"]
-
 if verbose:
     def debug(msg):
         print msg
@@ -54,7 +47,7 @@
         # " An optional feature could not be imported " ... ?
         raise TestSkipped, "Pseudo-terminals (seemingly) not functional."
 
-    if not os.isatty(slave_fd) and sys.platform not in fickle_isatty:
+    if not os.isatty(slave_fd):
         raise TestFailed, "slave_fd is not a tty"
 
     debug("Writing to slave_fd")

Modified: python/branches/release24-maint/Misc/ACKS
==============================================================================
--- python/branches/release24-maint/Misc/ACKS	(original)
+++ python/branches/release24-maint/Misc/ACKS	Fri May  5 12:52:43 2006
@@ -33,6 +33,7 @@
 Luigi Ballabio
 Michael J. Barber
 Chris Barker
+Quentin Barnes
 Cesar Eduardo Barros
 Des Barry
 Ulf Bartelt

Modified: python/branches/release24-maint/Modules/fcntlmodule.c
==============================================================================
--- python/branches/release24-maint/Modules/fcntlmodule.c	(original)
+++ python/branches/release24-maint/Modules/fcntlmodule.c	Fri May  5 12:52:43 2006
@@ -93,6 +93,7 @@
 static PyObject *
 fcntl_ioctl(PyObject *self, PyObject *args)
 {
+#define IOCTL_BUFSZ 1024
 	int fd;
 	int code;
 	int arg;
@@ -100,7 +101,7 @@
 	char *str;
 	int len;
 	int mutate_arg = 0;
-	char buf[1024];
+	char buf[IOCTL_BUFSZ+1];  /* argument plus NUL byte */
 
 	if (PyArg_ParseTuple(args, "O&iw#|i:ioctl",
                              conv_descriptor, &fd, &code, 
@@ -118,8 +119,9 @@
 			mutate_arg = 0;
 		}
 	       	if (mutate_arg) {
-			if (len <= sizeof buf) {
+			if (len <= IOCTL_BUFSZ) {
 				memcpy(buf, str, len);
+				buf[len] = '\0';
 				arg = buf;
 			} 
 			else {
@@ -127,13 +129,14 @@
 			}
 		}
 		else {
-			if (len > sizeof buf) {
+			if (len > IOCTL_BUFSZ) {
 				PyErr_SetString(PyExc_ValueError,
 					"ioctl string arg too long");
 				return NULL;
 			}
 			else {
 				memcpy(buf, str, len);
+				buf[len] = '\0';
 				arg = buf;
 			}
 		}
@@ -145,7 +148,7 @@
 		else {
 			ret = ioctl(fd, code, arg);
 		}
-		if (mutate_arg && (len < sizeof buf)) {
+		if (mutate_arg && (len < IOCTL_BUFSZ)) {
 			memcpy(str, buf, len);
 		}
 		if (ret < 0) {
@@ -163,12 +166,13 @@
 	PyErr_Clear();
 	if (PyArg_ParseTuple(args, "O&is#:ioctl",
                              conv_descriptor, &fd, &code, &str, &len)) {
-		if (len > sizeof buf) {
+		if (len > IOCTL_BUFSZ) {
 			PyErr_SetString(PyExc_ValueError,
 					"ioctl string arg too long");
 			return NULL;
 		}
 		memcpy(buf, str, len);
+		buf[len] = '\0';
 		Py_BEGIN_ALLOW_THREADS
 		ret = ioctl(fd, code, buf);
 		Py_END_ALLOW_THREADS
@@ -199,6 +203,7 @@
 		return NULL;
 	}
 	return PyInt_FromLong((long)ret);
+#undef IOCTL_BUFSZ
 }
 
 PyDoc_STRVAR(ioctl_doc,


More information about the Python-checkins mailing list