33
33
#ifndef PHP_WIN32
34
34
#define php_select (m , r , w , e , t ) select(m, r, w, e, t)
35
35
typedef unsigned long long php_timeout_ull ;
36
+ #define PHP_TIMEOUT_ULL_MAX ULLONG_MAX
36
37
#else
37
38
#include "win32/select.h"
38
39
#include "win32/sockets.h"
39
40
#include "win32/console.h"
40
41
typedef unsigned __int64 php_timeout_ull ;
42
+ #define PHP_TIMEOUT_ULL_MAX UINT64_MAX
41
43
#endif
42
44
43
45
#define GET_CTX_OPT (stream , wrapper , name , val ) (PHP_STREAM_CONTEXT(stream) && NULL != (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), wrapper, name)))
@@ -134,14 +136,21 @@ PHP_FUNCTION(stream_socket_client)
134
136
}
135
137
136
138
/* prepare the timeout value for use */
137
- conv = (php_timeout_ull ) (timeout * 1000000.0 );
139
+ struct timeval * tv_pointer ;
140
+ if (timeout < 0.0 || timeout >= (double ) PHP_TIMEOUT_ULL_MAX / 1000000.0 ) {
141
+ tv_pointer = NULL ;
142
+ } else {
143
+ conv = (php_timeout_ull ) (timeout * 1000000.0 );
138
144
#ifdef PHP_WIN32
139
- tv .tv_sec = (long )(conv / 1000000 );
140
- tv .tv_usec = (long )(conv % 1000000 );
145
+ tv .tv_sec = (long )(conv / 1000000 );
146
+ tv .tv_usec = (long )(conv % 1000000 );
141
147
#else
142
- tv .tv_sec = conv / 1000000 ;
143
- tv .tv_usec = conv % 1000000 ;
148
+ tv .tv_sec = conv / 1000000 ;
149
+ tv .tv_usec = conv % 1000000 ;
144
150
#endif
151
+ tv_pointer = & tv ;
152
+ }
153
+
145
154
if (zerrno ) {
146
155
ZEND_TRY_ASSIGN_REF_LONG (zerrno , 0 );
147
156
}
@@ -152,7 +161,7 @@ PHP_FUNCTION(stream_socket_client)
152
161
stream = php_stream_xport_create (ZSTR_VAL (host ), ZSTR_LEN (host ), REPORT_ERRORS ,
153
162
STREAM_XPORT_CLIENT | (flags & PHP_STREAM_CLIENT_CONNECT ? STREAM_XPORT_CONNECT : 0 ) |
154
163
(flags & PHP_STREAM_CLIENT_ASYNC_CONNECT ? STREAM_XPORT_CONNECT_ASYNC : 0 ),
155
- hashkey , & tv , context , & errstr , & err );
164
+ hashkey , tv_pointer , context , & errstr , & err );
156
165
157
166
158
167
if (stream == NULL ) {
@@ -275,19 +284,25 @@ PHP_FUNCTION(stream_socket_accept)
275
284
php_stream_from_zval (stream , zstream );
276
285
277
286
/* prepare the timeout value for use */
278
- conv = (php_timeout_ull ) (timeout * 1000000.0 );
287
+ struct timeval * tv_pointer ;
288
+ if (timeout < 0.0 || timeout >= (double ) PHP_TIMEOUT_ULL_MAX / 1000000.0 ) {
289
+ tv_pointer = NULL ;
290
+ } else {
291
+ conv = (php_timeout_ull ) (timeout * 1000000.0 );
279
292
#ifdef PHP_WIN32
280
- tv .tv_sec = (long )(conv / 1000000 );
281
- tv .tv_usec = (long )(conv % 1000000 );
293
+ tv .tv_sec = (long )(conv / 1000000 );
294
+ tv .tv_usec = (long )(conv % 1000000 );
282
295
#else
283
- tv .tv_sec = conv / 1000000 ;
284
- tv .tv_usec = conv % 1000000 ;
296
+ tv .tv_sec = conv / 1000000 ;
297
+ tv .tv_usec = conv % 1000000 ;
285
298
#endif
299
+ tv_pointer = & tv ;
300
+ }
286
301
287
302
if (0 == php_stream_xport_accept (stream , & clistream ,
288
303
zpeername ? & peername : NULL ,
289
304
NULL , NULL ,
290
- & tv , & errstr
305
+ tv_pointer , & errstr
291
306
) && clistream ) {
292
307
293
308
if (peername ) {
0 commit comments