]> granicus.if.org Git - php/commitdiff
MFH: fix #40750 (openssl stream wrapper ignores default_stream_timeout)
authorAntony Dovgal <tony2001@php.net>
Wed, 14 Mar 2007 19:22:14 +0000 (19:22 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 14 Mar 2007 19:22:14 +0000 (19:22 +0000)
NEWS
ext/openssl/xp_ssl.c

diff --git a/NEWS b/NEWS
index 235b8245fddcbfe0b53c2f2bfaeb6ccb241dc65d..27fcd5471fa43a69e383329e68f06f7efd0b9794 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,8 @@ PHP                                                                        NEWS
 - Fixed bug #40754 (added substr() & substr_replace() overflow checks). (Ilia)
 - Fixed bug #40752 (parse_ini_file() segfaults when a scalar setting is 
   redeclared as an array). (Tony)
+- Fixed bug #40750 (openssl stream wrapper ignores default_stream_timeout). 
+  (Tony)
 - Fixed bug #40727 (segfault in PDO when failed to bind parameters). (Tony)
 - Fixed bug #40709 (array_reduce() behaves strange with one item stored arrays).
   (Ilia)
index 36d1520e8c381ff04b29502dd01df99cc7ee7abc..df03982878ffe333afaebf4236451598e9a23be4 100644 (file)
@@ -47,6 +47,7 @@ int php_openssl_get_x509_list_id(void);
 typedef struct _php_openssl_netstream_data_t {
        php_netstream_data_t s;
        SSL *ssl_handle;
+       struct timeval connect_timeout;
        int enable_on_connect;
        int is_client;
        int ssl_active;
@@ -390,7 +391,7 @@ static inline int php_openssl_enable_crypto(php_stream *stream,
        int n, retry = 1;
 
        if (cparam->inputs.activate && !sslsock->ssl_active) {
-               float timeout = sslsock->s.timeout.tv_sec + sslsock->s.timeout.tv_usec / 1000000;
+               float timeout = sslsock->connect_timeout.tv_sec + sslsock->connect_timeout.tv_usec / 1000000;
                int blocked = sslsock->s.is_blocked;
 
                if (!sslsock->state_set) {
@@ -608,7 +609,7 @@ static int php_openssl_sockop_set_option(php_stream *stream, int option, int val
                                                tv.tv_sec = FG(default_socket_timeout);
                                                tv.tv_usec = 0;
                                        } else {
-                                               tv = sslsock->s.timeout;
+                                               tv = sslsock->connect_timeout;
                                        }
                                } else {
                                        tv.tv_sec = value;
@@ -766,8 +767,13 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen,
        memset(sslsock, 0, sizeof(*sslsock));
 
        sslsock->s.is_blocked = 1;
-       sslsock->s.timeout.tv_sec = timeout->tv_sec;
-       sslsock->s.timeout.tv_usec = timeout->tv_usec;
+       /* this timeout is used by standard stream funcs, therefor it should use the default value */
+       sslsock->s.timeout.tv_sec = FG(default_socket_timeout);
+       sslsock->s.timeout.tv_usec = 0;
+
+       /* use separate timeout for our private funcs */
+       sslsock->connect_timeout.tv_sec = timeout->tv_sec;
+       sslsock->connect_timeout.tv_usec = timeout->tv_usec;
 
        /* we don't know the socket until we have determined if we are binding or
         * connecting */