From: Richard Fussenegger Date: Mon, 29 May 2017 19:42:59 +0000 (+0200) Subject: Fixed php_socket_t to int conversion X-Git-Tag: php-7.2.0alpha2~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fa1cd224b3801a99790f367feca4d98b53771b7;p=php Fixed php_socket_t to int conversion This warning was about a possible loss of data due to the downcast of `php_socket_t` to `int`. The former maps to a platform specific type, hence, it might downcast from a 64 bit integer to a 32 bit intger. Fixed possibly overflowing vars Due to the change from `int` to `php_socket_t` some variables might overflow now. Changed all variables that might be affected. Revert "Fixed possibly overflowing vars" This reverts commit bf64fd5984409a208ef32108990a6085b6556273. Use aliased PHP socket type Using the alias protects us from changes to the underlying type. Removed ignored nfds argument The `nfds` argument to the Win32 `select` function is always ignored, regardless of its actual value. Hence, we should not pass it in the first place. See https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx for reference. Target value is not a pointer Avoid overflow in loop --- diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 0ff8b4103f..07e8a8c803 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -248,7 +248,7 @@ static void print_extensions(void) /* {{{ */ #define STDERR_FILENO 2 #endif -static inline int sapi_cli_select(int fd) +static inline int sapi_cli_select(php_socket_t fd) { fd_set wfd, dfd; struct timeval tv; diff --git a/win32/select.c b/win32/select.c index 7060ebf414..c59e4ba45d 100644 --- a/win32/select.c +++ b/win32/select.c @@ -34,7 +34,7 @@ * - Calling this with NULL sets as a portable way to sleep with sub-second * accuracy is not supported. * */ -PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv) +PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv) { ULONGLONG ms_total, limit; HANDLE handles[MAXIMUM_WAIT_OBJECTS]; @@ -61,7 +61,7 @@ PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, stru FD_ZERO(&sock_except); /* build an array of handles for non-sockets */ - for (i = 0; i < max_fd; i++) { + for (i = 0; i < INT_MAX && i < max_fd; i++) { if (SAFE_FD_ISSET(i, rfds) || SAFE_FD_ISSET(i, wfds) || SAFE_FD_ISSET(i, efds)) { handles[n_handles] = (HANDLE)(zend_uintptr_t)_get_osfhandle(i); if (handles[n_handles] == INVALID_HANDLE_VALUE) { @@ -87,7 +87,7 @@ PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, stru if (n_handles == 0) { /* plain sockets only - let winsock handle the whole thing */ - return select(max_fd, rfds, wfds, efds, tv); + return select(0, rfds, wfds, efds, tv); } /* mixture of handles and sockets; lets multiplex between @@ -111,7 +111,7 @@ PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, stru tvslice.tv_sec = 0; tvslice.tv_usec = 100000; - retcode = select(sock_max_fd+1, &aread, &awrite, &aexcept, &tvslice); + retcode = select(0, &aread, &awrite, &aexcept, &tvslice); } if (n_handles > 0) { /* check handles */ diff --git a/win32/select.h b/win32/select.h index 6f2d12e84d..ef91684363 100644 --- a/win32/select.h +++ b/win32/select.h @@ -18,5 +18,6 @@ /* $Id$ */ -PHPAPI int php_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv); +#include "php_network.h" +PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv);