Make tls_new_client_session set a destructor, too.
authorAlan T. DeKok <aland@freeradius.org>
Thu, 5 Mar 2015 17:27:15 +0000 (12:27 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 5 Mar 2015 17:27:15 +0000 (12:27 -0500)
So that ssn->ssl gets freed

src/main/tls.c

index 2cda42d..8260056 100644 (file)
@@ -214,6 +214,21 @@ static unsigned int psk_client_callback(SSL *ssl, UNUSED char const *hint,
 
 #endif
 
+static int _tls_session_free(tls_session_t *ssn)
+{
+       /*
+        *      Free any opaque TTLS or PEAP data.
+        */
+       if ((ssn->opaque) && (ssn->free_opaque)) {
+               ssn->free_opaque(ssn->opaque);
+               ssn->opaque = NULL;
+       }
+
+       session_close(ssn);
+
+       return 0;
+}
+
 tls_session_t *tls_new_client_session(TALLOC_CTX *ctx, fr_tls_server_conf_t *conf, int fd)
 {
        int verify_mode;
@@ -223,6 +238,8 @@ tls_session_t *tls_new_client_session(TALLOC_CTX *ctx, fr_tls_server_conf_t *con
        ssn = talloc_zero(ctx, tls_session_t);
        if (!ssn) return NULL;
 
+       talloc_set_destructor(ssn, _tls_session_free);
+
        ssn->ctx = conf->ctx;
 
        SSL_CTX_set_mode(ssn->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_AUTO_RETRY);
@@ -260,7 +277,6 @@ tls_session_t *tls_new_client_session(TALLOC_CTX *ctx, fr_tls_server_conf_t *con
                while ((err = ERR_get_error())) {
                        ERROR("tls: %s", ERR_error_string(err, NULL));
                }
-               SSL_free(ssn->ssl);
                talloc_free(ssn);
 
                return NULL;
@@ -271,21 +287,6 @@ tls_session_t *tls_new_client_session(TALLOC_CTX *ctx, fr_tls_server_conf_t *con
        return ssn;
 }
 
-static int _tls_session_free(tls_session_t *ssn)
-{
-       /*
-        *      Free any opaque TTLS or PEAP data.
-        */
-       if ((ssn->opaque) && (ssn->free_opaque)) {
-               ssn->free_opaque(ssn->opaque);
-               ssn->opaque = NULL;
-       }
-
-       session_close(ssn);
-
-       return 0;
-}
-
 tls_session_t *tls_new_session(TALLOC_CTX *ctx, fr_tls_server_conf_t *conf, REQUEST *request, bool client_cert)
 {
        tls_session_t *state = NULL;