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

index 2d77a05bf8f46a7e3b87b83bb6aea6c2e15078a3..3dcf6e6394487f54a2f4fd2c72e91050ac9209ca 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) {
@@ -607,7 +608,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;
@@ -765,8 +766,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 */