]> granicus.if.org Git - php/commitdiff
Check for FD_SETSIZE limit
authorDmitry Stogov <dmitry@php.net>
Wed, 21 Feb 2007 15:46:30 +0000 (15:46 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 21 Feb 2007 15:46:30 +0000 (15:46 +0000)
sapi/cgi/fastcgi.c

index 639d348a7d12fd2e6b945f413ae9a0c7bdd763a1..3ac12a2def79cf4bc9ef7f6fee33b9414b6924d6 100644 (file)
@@ -757,18 +757,23 @@ int fcgi_accept_request(fcgi_request *req)
                                break;
 #else
                                if (req->fd >= 0) {
-                                       struct timeval tv = {5,0};
-                                       fd_set set;
+                                       if (req->fd < FD_SETSIZE) {
+                                               struct timeval tv = {5,0};
+                                               fd_set set;
 
-                                       FD_ZERO(&set);
-                                       FD_SET(req->fd, &set);
+                                               FD_ZERO(&set);
+                                               FD_SET(req->fd, &set);
 try_again:
-                                       errno = 0;
-                                       if (select(req->fd + 1, &set, NULL, NULL, &tv) >= 0 && FD_ISSET(req->fd, &set)) {
-                                               break;
+                                               errno = 0;
+                                               if (select(req->fd + 1, &set, NULL, NULL, &tv) >= 0 && FD_ISSET(req->fd, &set)) {
+                                                       break;
+                                               }
+                                               if (errno == EINTR) goto try_again;
+                                               fcgi_close(req, 1, 0);
+                                       } else {
+                                               fprintf(stderr, "Too many open file descriptors. FD_SETSIZE limit exceeded.");
+                                               fcgi_close(req, 1, 0);
                                        }
-                                       if (errno == EINTR) goto try_again;
-                                       fcgi_close(req, 1, 0);
                                }
 #endif
                        }