Commit:    0cea9e6843384c6c0ebb52047c42b0431a4f5660
Author:    Remi Collet <r...@php.net>         Fri, 1 Feb 2013 19:23:25 +0100
Parents:   b09f5a4f56348a2f0b12f3d1a15b880845aca9c6
Branches:  PHP-5.4 PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=0cea9e6843384c6c0ebb52047c42b0431a4f5660

Log:
Fixed bug #64128 buit-in web server is broken on ppc64.

fdset management using bit operator is broken on non-x86 arch
and cause built-in server the enter an infinite loop of "select"
and never handle any request.

Bugs:
https://bugs.php.net/64128

Changed paths:
  M  NEWS
  M  sapi/cli/php_cli_server.c


Diff:
diff --git a/NEWS b/NEWS
index 2fc746e..2aff180 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ PHP                                                             
           NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2012, PHP 5.4.13
 
+- CLI server:
+  . Fixed bug #64128 (buit-in web server is broken on ppc64). (Remi)
+
 ?? ??? 2012, PHP 5.4.12
 
 - Core:
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index 28aba19..6a4e7c5 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -710,10 +710,9 @@ static void 
php_cli_server_poller_remove(php_cli_server_poller *poller, int mode
        if (fd == poller->max_fd) {
                while (fd > 0) {
                        fd--;
-                       if (((unsigned int *)&poller->rfds)[fd / (8 * 
sizeof(unsigned int))] || ((unsigned int *)&poller->wfds)[fd / (8 * 
sizeof(unsigned int))]) {
+                       if (PHP_SAFE_FD_ISSET(fd, &poller->rfds) || 
PHP_SAFE_FD_ISSET(fd, &poller->wfds)) {
                                break;
                        }
-                       fd -= fd % (8 * sizeof(unsigned int));
                }
                poller->max_fd = fd;
        }
@@ -772,23 +771,20 @@ static int 
php_cli_server_poller_iter_on_active(php_cli_server_poller *poller, v
        }
 
 #else
-       php_socket_t fd = 0;
+       php_socket_t fd;
        const php_socket_t max_fd = poller->max_fd;
-       const unsigned int *pr = (unsigned int *)&poller->active.rfds,
-                          *pw = (unsigned int *)&poller->active.wfds,
-                          *e = pr + (max_fd + (8 * sizeof(unsigned int)) - 1) 
/ (8 * sizeof(unsigned int));
-       unsigned int mask;
-       while (pr < e && fd <= max_fd) {
-               for (mask = 1; mask; mask <<= 1, fd++) {
-                       int events = (*pr & mask ? POLLIN: 0) | (*pw & mask ? 
POLLOUT: 0);
-                       if (events) {
-                               if (SUCCESS != callback(opaque, fd, events)) {
-                                       retval = FAILURE;
-                               }
-                       }
+
+       for (fd=0 ; fd<=max_fd ; fd++)  {
+               if (PHP_SAFE_FD_ISSET(fd, &poller->active.rfds)) {
+                if (SUCCESS != callback(opaque, fd, POLLIN)) {
+                    retval = FAILURE;
+                }
+               }
+               if (PHP_SAFE_FD_ISSET(fd, &poller->active.wfds)) {
+                if (SUCCESS != callback(opaque, fd, POLLOUT)) {
+                    retval = FAILURE;
+                }
                }
-               pr++;
-               pw++;
        }
 #endif
        return retval;


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to