]> granicus.if.org Git - php/commitdiff
Fixed php_socket_t to int conversion
authorRichard Fussenegger <fleshgrinder@users.noreply.github.com>
Mon, 29 May 2017 19:42:59 +0000 (21:42 +0200)
committerAnatol Belski <ab@php.net>
Thu, 15 Jun 2017 21:48:03 +0000 (23:48 +0200)
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

sapi/cli/php_cli.c
win32/select.c
win32/select.h

index 0ff8b4103f18d32a7226ef4c7f5d5bd70c9261f4..07e8a8c803f638cde1fe766d2b52c5b56b69480e 100644 (file)
@@ -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;
index 7060ebf41417c706909b5ce681bbc56f4e94db35..c59e4ba45d6123d18483704e821c0a91745a0b97 100644 (file)
@@ -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 */
index 6f2d12e84d336708ca185319c38445d14e71a79f..ef91684363d13376b1b17ba1902e839dcdcd8e65 100644 (file)
@@ -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);