]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/tls.c
Berlement already freed in ber_flush
[openldap] / libraries / libldap / tls.c
index 2ba33970f1af18818edc33c7b512ab4ccaa2a75f..504263ed14d3df89323f441daa95596dc9ba1d8a 100644 (file)
@@ -111,8 +111,10 @@ static void tls_init_threads( void )
 void
 ldap_int_tls_destroy( struct ldapoptions *lo )
 {
-       SSL_CTX_free( lo->ldo_tls_ctx );
-       lo->ldo_tls_ctx = NULL;
+       if ( lo->ldo_tls_ctx ) {
+               SSL_CTX_free( lo->ldo_tls_ctx );
+               lo->ldo_tls_ctx = NULL;
+       }
 
        if ( lo->ldo_tls_certfile ) {
                LDAP_FREE( lo->ldo_tls_certfile );
@@ -146,6 +148,10 @@ ldap_int_tls_destroy( struct ldapoptions *lo )
 void
 ldap_pvt_tls_destroy( void )
 {
+       struct ldapoptions *lo = LDAP_INT_GLOBAL_OPT();   
+
+       ldap_int_tls_destroy( lo );
+
        EVP_cleanup();
        ERR_remove_state(0);
        ERR_free_strings();
@@ -1245,6 +1251,10 @@ ldap_pvt_tls_get_option( LDAP *ld, int option, void *arg )
                break;
        case LDAP_OPT_X_TLS_CTX:
                *(void **)arg = lo->ldo_tls_ctx;
+               if ( lo->ldo_tls_ctx ) {
+                       SSL_CTX *ctx = lo->ldo_tls_ctx;
+                       CRYPTO_add( &ctx->references, 1, CRYPTO_LOCK_SSL_CTX );
+               }
                break;
        case LDAP_OPT_X_TLS_CACERTFILE:
                *(char **)arg = lo->ldo_tls_cacertfile ?
@@ -1343,6 +1353,8 @@ ldap_pvt_tls_set_option( LDAP *ld, int option, void *arg )
                return -1;
 
        case LDAP_OPT_X_TLS_CTX:
+               if ( lo->ldo_tls_ctx )
+                       SSL_CTX_free( lo->ldo_tls_ctx );
                lo->ldo_tls_ctx = arg;
                return 0;
        case LDAP_OPT_X_TLS_CONNECT_CB:
@@ -1409,6 +1421,8 @@ ldap_pvt_tls_set_option( LDAP *ld, int option, void *arg )
 
        case LDAP_OPT_X_TLS_NEWCTX:
                if ( !arg ) return -1;
+               if ( lo->ldo_tls_ctx )
+                       SSL_CTX_free( lo->ldo_tls_ctx );
                lo->ldo_tls_ctx = NULL;
                return ldap_int_tls_init_ctx( lo, *(int *)arg );
        default: