From: Ard Biesheuvel Date: Mon, 9 Dec 2013 15:54:42 +0000 (+0100) Subject: cli: don't cast away const in select() timeout argument X-Git-Tag: POST_64BIT_BRANCH_MERGE^2~109^2~18^2~338^2~9^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f33265d57281910652bb58f5f9d8bd9d9dd44fe8;p=php cli: don't cast away const in select() timeout argument The timeout argument to select() is modified to reflect the time remaining when the function returns on a non-timeout condition. Passing a pointer to const data and casting away the const-ness is asking for trouble, but for some reason, this trouble manifests itself only on non-x86 architectures [whose implementation of select() in glibc is different from the one supplied for x86] Fix this by passing a stack copy of the timeout argument to select() --- diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 105b8ae157..939eb5a501 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -893,9 +893,11 @@ static void php_cli_server_poller_remove(php_cli_server_poller *poller, int mode static int php_cli_server_poller_poll(php_cli_server_poller *poller, const struct timeval *tv) /* {{{ */ { + struct timeval t = *tv; + memmove(&poller->active.rfds, &poller->rfds, sizeof(poller->rfds)); memmove(&poller->active.wfds, &poller->wfds, sizeof(poller->wfds)); - return php_select(poller->max_fd + 1, &poller->active.rfds, &poller->active.wfds, NULL, (struct timeval *)tv); + return php_select(poller->max_fd + 1, &poller->active.rfds, &poller->active.wfds, NULL, &t); } /* }}} */ static int php_cli_server_poller_iter_on_active(php_cli_server_poller *poller, void *opaque, int(*callback)(void *, int fd, int events)) /* {{{ */