From: Alan T. DeKok Date: Mon, 27 Mar 2017 19:48:49 +0000 (-0400) Subject: re-add SSL wrappers for freeing VPs and Certs. X-Git-Tag: release_3_0_14~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63559782c19507cbe9e616d783e51b11c9e6dc72;p=thirdparty%2Ffreeradius-server.git re-add SSL wrappers for freeing VPs and Certs. because OpenSSL caches things at it's own pleasure... --- diff --git a/src/main/tls.c b/src/main/tls.c index 820f27fd9d8..a7553e0c2bf 100644 --- a/src/main/tls.c +++ b/src/main/tls.c @@ -2525,6 +2525,38 @@ static int set_ecdh_curve(SSL_CTX *ctx, char const *ecdh_curve, bool disable_sin #endif #endif +/* + * DIE OPENSSL DIE DIE DIE + * + * What a palaver, just to free some data attached the + * session. We need to do this because the "remove" callback + * is called when refcount > 0 sometimes, if another thread + * is using the session + */ +static void sess_free_vps(UNUSED void *parent, void *data_ptr, + UNUSED CRYPTO_EX_DATA *ad, UNUSED int idx, + UNUSED long argl, UNUSED void *argp) +{ + VALUE_PAIR *vp = data_ptr; + if (!vp) return; + + DEBUG2(LOG_PREFIX ": Freeing cached session VPs"); + + fr_pair_list_free(&vp); +} + +static void sess_free_certs(UNUSED void *parent, void *data_ptr, + UNUSED CRYPTO_EX_DATA *ad, UNUSED int idx, + UNUSED long argl, UNUSED void *argp) +{ + VALUE_PAIR **certs = data_ptr; + if (!certs) return; + + DEBUG2(LOG_PREFIX ": Freeing cached session Certificates"); + + fr_pair_list_free(certs); +} + /** Add all the default ciphers and message digests reate our context. * * This should be called exactly once from main, before reading the main config @@ -2540,7 +2572,7 @@ void tls_global_init(void) /* * Initialize the index for the certificates. */ - fr_tls_ex_index_certs = SSL_SESSION_get_ex_new_index(0, NULL, NULL, NULL, NULL); + fr_tls_ex_index_certs = SSL_SESSION_get_ex_new_index(0, NULL, NULL, NULL, sess_free_certs); } #ifdef ENABLE_OPENSSL_VERSION_CHECK @@ -2957,7 +2989,7 @@ post_ca: SSL_CTX_set_quiet_shutdown(ctx, 1); if (fr_tls_ex_index_vps < 0) - fr_tls_ex_index_vps = SSL_SESSION_get_ex_new_index(0, NULL, NULL, NULL, NULL); + fr_tls_ex_index_vps = SSL_SESSION_get_ex_new_index(0, NULL, NULL, NULL, sess_free_vps); } /* diff --git a/src/main/tls_listen.c b/src/main/tls_listen.c index 32cf5644010..614bfda01a8 100644 --- a/src/main/tls_listen.c +++ b/src/main/tls_listen.c @@ -175,7 +175,7 @@ static int tls_socket_recv(rad_listen_t *listener) SSL_set_ex_data(sock->ssn->ssl, FR_TLS_EX_INDEX_REQUEST, (void *)request); SSL_set_ex_data(sock->ssn->ssl, fr_tls_ex_index_certs, (void *) &sock->certs); - SSL_set_ex_data(sock->ssn->ssl, FR_TLS_EX_INDEX_TALLOC, sock); + SSL_set_ex_data(sock->ssn->ssl, FR_TLS_EX_INDEX_TALLOC, NULL); doing_init = true; } diff --git a/src/modules/rlm_eap/libeap/eap_tls.c b/src/modules/rlm_eap/libeap/eap_tls.c index 9cff1d4f814..fadc72c8108 100644 --- a/src/modules/rlm_eap/libeap/eap_tls.c +++ b/src/modules/rlm_eap/libeap/eap_tls.c @@ -96,7 +96,7 @@ tls_session_t *eaptls_session(eap_handler_t *handler, fr_tls_server_conf_t *tls_ SSL_set_ex_data(ssn->ssl, FR_TLS_EX_INDEX_STORE, (void *)tls_conf->ocsp_store); #endif SSL_set_ex_data(ssn->ssl, FR_TLS_EX_INDEX_SSN, (void *)ssn); - SSL_set_ex_data(ssn->ssl, FR_TLS_EX_INDEX_TALLOC, handler); + SSL_set_ex_data(ssn->ssl, FR_TLS_EX_INDEX_TALLOC, NULL); return talloc_steal(handler, ssn); /* ssn */ }