@@ -46,6 +46,11 @@ PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *e
46
46
struct timeval tvslice ;
47
47
int retcode ;
48
48
49
+ /* As max_fd is unsigned, non socket might overflow. */
50
+ if (max_fd > (php_socket_t )INT_MAX ) {
51
+ return -1 ;
52
+ }
53
+
49
54
#define SAFE_FD_ISSET (fd , set ) (set != NULL && FD_ISSET(fd, set))
50
55
51
56
/* calculate how long we need to wait in milliseconds */
@@ -61,7 +66,7 @@ PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *e
61
66
FD_ZERO (& sock_except );
62
67
63
68
/* build an array of handles for non-sockets */
64
- for (i = 0 ; i < INT_MAX && i < max_fd ; i ++ ) {
69
+ for (i = 0 ; i < max_fd ; i ++ ) {
65
70
if (SAFE_FD_ISSET (i , rfds ) || SAFE_FD_ISSET (i , wfds ) || SAFE_FD_ISSET (i , efds )) {
66
71
handles [n_handles ] = (HANDLE )(zend_uintptr_t )_get_osfhandle (i );
67
72
if (handles [n_handles ] == INVALID_HANDLE_VALUE ) {
@@ -87,7 +92,7 @@ PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *e
87
92
88
93
if (n_handles == 0 ) {
89
94
/* plain sockets only - let winsock handle the whole thing */
90
- return select (0 , rfds , wfds , efds , tv );
95
+ return select (-1 , rfds , wfds , efds , tv );
91
96
}
92
97
93
98
/* mixture of handles and sockets; lets multiplex between
@@ -111,7 +116,7 @@ PHPAPI int php_select(php_socket_t max_fd, fd_set *rfds, fd_set *wfds, fd_set *e
111
116
tvslice .tv_sec = 0 ;
112
117
tvslice .tv_usec = 100000 ;
113
118
114
- retcode = select (0 , & aread , & awrite , & aexcept , & tvslice );
119
+ retcode = select (-1 , & aread , & awrite , & aexcept , & tvslice );
115
120
}
116
121
if (n_handles > 0 ) {
117
122
/* check handles */
0 commit comments