Permalink
Browse files

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.
  • Loading branch information...
1 parent b09f5a4 commit 0cea9e6843384c6c0ebb52047c42b0431a4f5660 @remicollet remicollet committed Feb 1, 2013
Showing with 16 additions and 17 deletions.
  1. +3 −0 NEWS
  2. +13 −17 sapi/cli/php_cli_server.c
View
3 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:
View
30 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;

0 comments on commit 0cea9e6

Please sign in to comment.