summaryrefslogtreecommitdiffstats
path: root/php-5.4.11-select.patch
diff options
context:
space:
mode:
Diffstat (limited to 'php-5.4.11-select.patch')
-rw-r--r--php-5.4.11-select.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/php-5.4.11-select.patch b/php-5.4.11-select.patch
new file mode 100644
index 0000000..3c2a9a3
--- /dev/null
+++ b/php-5.4.11-select.patch
@@ -0,0 +1,68 @@
+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
+ 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;
+--
+1.7.11.5
+