Recently mentioned on oss-sec, avoids an FD_SET overflow.
Any comments/OKs?

Adam, do you still want to be listed as maintainer?


Index: Makefile
===================================================================
RCS file: /cvs/ports/www/fcgi/Makefile,v
retrieving revision 1.22
diff -u -p -r1.22 Makefile
--- Makefile    14 Jun 2014 10:34:45 -0000      1.22
+++ Makefile    6 Feb 2015 12:01:53 -0000
@@ -3,7 +3,7 @@
 COMMENT=               FastCGI Development Kit
 
 DISTNAME=              fcgi-2.4.0
-REVISION=              9
+REVISION=              10
 CATEGORIES=            www
 SHARED_LIBS += fcgi                 0.0      # .0.0
 SHARED_LIBS += fcgi++               1.0      # .1.0
Index: patches/patch-libfcgi_os_unix_c
===================================================================
RCS file: patches/patch-libfcgi_os_unix_c
diff -N patches/patch-libfcgi_os_unix_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libfcgi_os_unix_c     6 Feb 2015 12:01:53 -0000
@@ -0,0 +1,68 @@
+$OpenBSD$
+
+select->poll conversion, modified from patch at
+https://bugs.launchpad.net/ubuntu/+source/libfcgi/+bug/933417
+(difference: don't use env variables to control timeouts)
+
+--- libfcgi/os_unix.c.orig     Tue Mar  5 19:14:49 2002
++++ libfcgi/os_unix.c  Fri Feb  6 11:51:00 2015
+@@ -42,6 +42,7 @@ static const char rcsid[] = "$Id: os_unix.c,v 1.37 200
+ #include <sys/time.h>
+ #include <sys/un.h>
+ #include <signal.h>
++#include <poll.h>
+ 
+ #ifdef HAVE_NETDB_H
+ #include <netdb.h>
+@@ -103,6 +104,9 @@ static int volatile maxFd = -1;
+ static int shutdownPending = FALSE;
+ static int shutdownNow = FALSE;
+ 
++static int libfcgiOsClosePollTimeout = 2000;
++static int libfcgiIsAfUnixKeeperPollTimeout = 2000;
++
+ void OS_ShutdownPending()
+ {
+     shutdownPending = TRUE;
+@@ -755,19 +759,16 @@ int OS_Close(int fd)
+ 
+     if (shutdown(fd, 1) == 0)
+     {
+-        struct timeval tv;
+-        fd_set rfds;
++        struct pollfd pfd;
+         int rv;
+         char trash[1024];
+ 
+-        FD_ZERO(&rfds);
++        pfd.fd = fd;
++        pfd.events = POLLIN;
+ 
+         do 
+         {
+-            FD_SET(fd, &rfds);
+-            tv.tv_sec = 2;
+-            tv.tv_usec = 0;
+-            rv = select(fd + 1, &rfds, NULL, NULL, &tv);
++            rv = poll(&pfd, 1, libfcgiOsClosePollTimeout);
+         }
+         while (rv > 0 && read(fd, trash, sizeof(trash)) > 0);
+     }
+@@ -1116,13 +1117,11 @@ static int is_reasonable_accept_errno (const int error
+  */
+ static int is_af_unix_keeper(const int fd)
+ {
+-    struct timeval tval = { READABLE_UNIX_FD_DROP_DEAD_TIMEVAL };
+-    fd_set read_fds;
++    struct pollfd pfd;
++    pfd.fd = fd;
++    pfd.events = POLLIN;
+ 
+-    FD_ZERO(&read_fds);
+-    FD_SET(fd, &read_fds);
+-
+-    return select(fd + 1, &read_fds, NULL, NULL, &tval) >= 0 && FD_ISSET(fd, 
&read_fds);
++    return poll(&pfd, 1, libfcgiIsAfUnixKeeperPollTimeout) >= 0 && 
(pfd.revents & POLLIN);
+ }
+ 
+ /*

Reply via email to