2013-02-04 10:02:35 +00:00
|
|
|
From 0cea9e6843384c6c0ebb52047c42b0431a4f5660 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Remi Collet <remi@php.net>
|
|
|
|
Date: Fri, 1 Feb 2013 19:23:25 +0100
|
|
|
|
Subject: [PATCH] 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.
|
|
|
|
---
|
|
|
|
NEWS | 3 +++
|
|
|
|
sapi/cli/php_cli_server.c | 30 +++++++++++++-----------------
|
|
|
|
2 files changed, 16 insertions(+), 17 deletions(-)
|
|
|
|
|
|
|
|
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
|
2013-02-01 18:12:36 +00:00
|
|
|
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))]) {
|
2013-02-04 10:02:35 +00:00
|
|
|
+ if (PHP_SAFE_FD_ISSET(fd, &poller->rfds) || PHP_SAFE_FD_ISSET(fd, &poller->wfds)) {
|
2013-02-01 18:12:36 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
- fd -= fd % (8 * sizeof(unsigned int));
|
|
|
|
}
|
|
|
|
poller->max_fd = fd;
|
|
|
|
}
|
2013-02-04 10:02:35 +00:00
|
|
|
@@ -772,23 +771,20 @@ static int php_cli_server_poller_iter_on_active(php_cli_server_poller *poller, v
|
2013-02-01 18:12:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#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;
|
2013-02-04 10:02:35 +00:00
|
|
|
+ }
|
2013-02-01 18:12:36 +00:00
|
|
|
+ }
|
|
|
|
+ if (PHP_SAFE_FD_ISSET(fd, &poller->active.wfds)) {
|
|
|
|
+ if (SUCCESS != callback(opaque, fd, POLLOUT)) {
|
|
|
|
+ retval = FAILURE;
|
2013-02-04 10:02:35 +00:00
|
|
|
+ }
|
2013-02-01 18:12:36 +00:00
|
|
|
}
|
|
|
|
- pr++;
|
|
|
|
- pw++;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return retval;
|
2013-02-04 10:02:35 +00:00
|
|
|
--
|
|
|
|
1.7.11.5
|
|
|
|
|