[Python-checkins] r45712 - in python/trunk: Lib/test/test_pty.py Misc/ACKS Modules/fcntlmodule.c

Neal Norwitz nnorwitz at gmail.com
Wed Apr 26 05:21:03 CEST 2006


Should this be backported to 2.4?

On 4/25/06, thomas.wouters <python-checkins at python.org> wrote:
> Author: thomas.wouters
> Date: Tue Apr 25 15:53:23 2006
> New Revision: 45712
>
> Modified:
>    python/trunk/Lib/test/test_pty.py
>    python/trunk/Misc/ACKS
>    python/trunk/Modules/fcntlmodule.c
> Log:
>
> 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. (I wasn't able to reproduce it with this patch, but it
> has been somewhat elusive to start with.)
>
>
>
> Modified: python/trunk/Lib/test/test_pty.py
> ==============================================================================
> --- python/trunk/Lib/test/test_pty.py   (original)
> +++ python/trunk/Lib/test/test_pty.py   Tue Apr 25 15:53:23 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/trunk/Misc/ACKS
> ==============================================================================
> --- python/trunk/Misc/ACKS      (original)
> +++ python/trunk/Misc/ACKS      Tue Apr 25 15:53:23 2006
> @@ -33,6 +33,7 @@
>  Luigi Ballabio
>  Michael J. Barber
>  Chris Barker
> +Quentin Barnes
>  Cesar Eduardo Barros
>  Des Barry
>  Ulf Bartelt
>
> Modified: python/trunk/Modules/fcntlmodule.c
> ==============================================================================
> --- python/trunk/Modules/fcntlmodule.c  (original)
> +++ python/trunk/Modules/fcntlmodule.c  Tue Apr 25 15:53:23 2006
> @@ -95,6 +95,7 @@
>  static PyObject *
>  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
> @@ -106,7 +107,7 @@
>         char *str;
>         Py_ssize_t len;
>         int mutate_arg = 1;
> -       char buf[1024];
> +       char buf[IOCTL_BUFSZ+1];  /* argument plus NUL byte */
>
>         if (PyArg_ParseTuple(args, "O&Iw#|i:ioctl",
>                               conv_descriptor, &fd, &code,
> @@ -114,8 +115,9 @@
>                 char *arg;
>
>                 if (mutate_arg) {
> -                       if (len <= sizeof buf) {
> +                       if (len <= IOCTL_BUFSZ) {
>                                 memcpy(buf, str, len);
> +                               buf[len] = '\0';
>                                 arg = buf;
>                         }
>                         else {
> @@ -123,13 +125,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;
>                         }
>                 }
> @@ -141,7 +144,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) {
> @@ -159,12 +162,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
> @@ -195,6 +199,7 @@
>                 return NULL;
>         }
>         return PyInt_FromLong((long)ret);
> +#undef IOCTL_BUFSZ
>  }
>
>  PyDoc_STRVAR(ioctl_doc,
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>


More information about the Python-checkins mailing list