]> granicus.if.org Git - php/commitdiff
cli: don't cast away const in select() timeout argument
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 9 Dec 2013 15:54:42 +0000 (16:54 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 9 Dec 2013 15:54:42 +0000 (16:54 +0100)
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()

sapi/cli/php_cli_server.c

index 105b8ae157cda132a55f23c9ba896e5affd5abdf..939eb5a5017e2ca59153338ba45bf1d466474844 100644 (file)
@@ -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)) /* {{{ */