ports/156759: [patch] lang/python: kevent does not accept KQ_NOTE_EXIT (and other (f)flags)

David Naylor naylor.b.david at gmail.com
Sun May 1 18:30:16 UTC 2011


>Number:         156759
>Category:       ports
>Synopsis:       [patch] lang/python: kevent does not accept KQ_NOTE_EXIT (and other (f)flags)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun May 01 18:30:10 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     David Naylor
>Release:        FreeBSD-current
>Organization:
Private
>Environment:
FreeBSD dragon.dg 9.0-CURRENT FreeBSD 9.0-CURRENT #0: Wed Apr 13 19:16:40 SAST 2011     root at dragon.dg:/tmp/home/freebsd9/src/sys/DRAGON  amd64
>Description:
(Taken from upstream bug report: http://bugs.python.org/issue11973)
(This issue appears to affect all releases of python)

kevent does not accept all legitimate parameters, such as KQ_NOTE_EXIT.  

For example:
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- Modules/selectmodule.c~	2011-05-01 20:05:12.000000000 +0200
+++ Modules/selectmodule.c	2011-05-01 20:19:46.000000000 +0200
@@ -1246,7 +1246,7 @@
     PyObject *pfd;
     static char *kwlist[] = {"ident", "filter", "flags", "fflags",
                              "data", "udata", NULL};
-    static char *fmt = "O|hhi" INTPTRT_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
+    static char *fmt = "O|hHI" INTPTRT_FMT_UNIT UINTPTRT_FMT_UNIT ":kevent";
 
     EV_SET(&(self->e), 0, EVFILT_READ, EV_ADD, 0, 0, 0); /* defaults */
 


>Release-Note:
>Audit-Trail:
>Unformatted:
 >> from select import *
 >> kevent(0, KQ_FILTER_PROC, KQ_EV_ADD | KQ_EV_ENABLE, KQ_NOTE_EXIT)
 OverflowError: signed integer is greater than maximum
 
 While the following C code compiles (under -Wall -pedantic) without error, or warning:
 """
 #include <sys/types.h>
 #include <sys/event.h>
 #include <sys/time.h>
 
 int main(int argc, char **argv) {
 
   struct kevent ke;
 
   EV_SET(&ke, 0, EVFILT_PROC, EV_ADD | EV_ENABLE, NOTE_EXIT, 0, 0);
 
   return (0);
 
 }
 """
 
 Looking at the Modules/selectmodule.c file it is clear that the fields "flags" and "fflags" are defined as T_USHORT and T_UINT however the flags passed to PyArg_ParseTupleAndKeywords are 'h' and 'i' respectively (implying signed numbers).  
 
 A workaround exists where values X > (2**31 - 1) are passed as (X - 2**32).  Also the attached patch fixes the error.



More information about the freebsd-ports-bugs mailing list