]> granicus.if.org Git - php/commitdiff
Fixes a memory leak in ssl streams. The context was not properly freed
authorMikko Koppanen <mkoppanen@php.net>
Sat, 22 Aug 2009 02:31:23 +0000 (02:31 +0000)
committerMikko Koppanen <mkoppanen@php.net>
Sat, 22 Aug 2009 02:31:23 +0000 (02:31 +0000)
ext/openssl/xp_ssl.c

index 07180729a3f682052aa0b165b274a2f474541cc1..fda2d3796fbedba8710a6237ac15eaa61dc31406 100644 (file)
@@ -48,6 +48,7 @@ int php_openssl_get_x509_list_id(void);
 typedef struct _php_openssl_netstream_data_t {
        php_netstream_data_t s;
        SSL *ssl_handle;
+       SSL_CTX *ctx;
        struct timeval connect_timeout;
        int enable_on_connect;
        int is_client;
@@ -254,6 +255,10 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle TSRMLS_
                        SSL_free(sslsock->ssl_handle);
                        sslsock->ssl_handle = NULL;
                }
+               if (sslsock->ctx) {
+                       SSL_CTX_free(sslsock->ctx);
+                       sslsock->ctx = NULL;
+               }
                if (sslsock->s.socket != SOCK_ERR) {
 #ifdef PHP_WIN32
                        /* prevent more data from coming in */
@@ -295,7 +300,6 @@ static inline int php_openssl_setup_crypto(php_stream *stream,
                php_stream_xport_crypto_param *cparam
                TSRMLS_DC)
 {
-       SSL_CTX *ctx;
        SSL_METHOD *method;
        
        if (sslsock->ssl_handle) {
@@ -344,18 +348,19 @@ static inline int php_openssl_setup_crypto(php_stream *stream,
 
        }
 
-       ctx = SSL_CTX_new(method);
-       if (ctx == NULL) {
+       sslsock->ctx = SSL_CTX_new(method);
+       if (sslsock->ctx == NULL) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to create an SSL context");
                return -1;
        }
 
-       SSL_CTX_set_options(ctx, SSL_OP_ALL);
+       SSL_CTX_set_options(sslsock->ctx, SSL_OP_ALL);
 
-       sslsock->ssl_handle = php_SSL_new_from_context(ctx, stream TSRMLS_CC);
+       sslsock->ssl_handle = php_SSL_new_from_context(sslsock->ctx, stream TSRMLS_CC);
        if (sslsock->ssl_handle == NULL) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to create an SSL handle");
-               SSL_CTX_free(ctx);
+               SSL_CTX_free(sslsock->ctx);
+               sslsock->ctx = NULL;
                return -1;
        }
 
@@ -776,6 +781,9 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen,
         * connecting */
        sslsock->s.socket = -1;
        
+       /* Initialize context as NULL */
+       sslsock->ctx = NULL;    
+       
        stream = php_stream_alloc_rel(&php_openssl_socket_ops, sslsock, persistent_id, "r+");
 
        if (stream == NULL)     {