Browse Source

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 bf64fd5984.

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
pull/2561/merge
Richard Fussenegger 9 years ago
committed by Anatol Belski
parent
commit
5fa1cd224b
  1. 2
      sapi/cli/php_cli.c
  2. 8
      win32/select.c
  3. 3
      win32/select.h

2
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;

8
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 */

3
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);
Loading…
Cancel
Save