[asterisk-commits] mmichelson: branch 10 r367003 - in /branches/10: ./ channels/ include/asteris...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri May 18 12:00:26 CDT 2012
Author: mmichelson
Date: Fri May 18 12:00:14 2012
New Revision: 367003
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=367003
Log:
Fix memory leak of SSL_CTX structures in TLS core.
SSL_CTX structures were allocated but never freed. This was a bigger
issue for clients than servers since new SSL_CTX structures could be
allocated for each connection. Servers, on the other hand, typically
set up a single SSL_CTX for their lifetime.
This is solved in two ways:
1. In __ssl_setup(), if a tcptls_cfg has an ssl_ctx on it, it is
freed so that a new one can take its place.
2. A companion to ast_ssl_setup() called ast_ssl_teardown() has
been added so that servers can properly free their SSL_CTXs.
(issue ASTERISK-19278)
........
Merged revisions 367002 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/10/ (props changed)
branches/10/channels/chan_sip.c
branches/10/include/asterisk/tcptls.h
branches/10/main/tcptls.c
Propchange: branches/10/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/10/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/channels/chan_sip.c?view=diff&rev=367003&r1=367002&r2=367003
==============================================================================
--- branches/10/channels/chan_sip.c (original)
+++ branches/10/channels/chan_sip.c Fri May 18 12:00:14 2012
@@ -31545,6 +31545,7 @@
if (sip_tls_desc.master) {
ast_tcptls_server_stop(&sip_tls_desc);
}
+ ast_ssl_teardown(sip_tls_desc.tls_cfg);
/* Kill all existing TCP/TLS threads */
i = ao2_iterator_init(threadt, 0);
Modified: branches/10/include/asterisk/tcptls.h
URL: http://svnview.digium.com/svn/asterisk/branches/10/include/asterisk/tcptls.h?view=diff&rev=367003&r1=367002&r2=367003
==============================================================================
--- branches/10/include/asterisk/tcptls.h (original)
+++ branches/10/include/asterisk/tcptls.h Fri May 18 12:00:14 2012
@@ -190,7 +190,24 @@
* \version 1.6.1 changed desc parameter to be of ast_tcptls_session_args type
*/
void ast_tcptls_server_stop(struct ast_tcptls_session_args *desc);
+
+/*!
+ * \brief Set up an SSL server
+ *
+ * \param cfg Configuration for the SSL server
+ * \retval 1 Success
+ * \retval 0 Failure
+ */
int ast_ssl_setup(struct ast_tls_config *cfg);
+
+/*!
+ * \brief free resources used by an SSL server
+ *
+ * \note This only needs to be called if ast_ssl_setup() was
+ * directly called first.
+ * \param cfg Configuration for the SSL server
+ */
+void ast_ssl_teardown(struct ast_tls_config *cfg);
/*!
* \brief Used to parse conf files containing tls/ssl options.
Modified: branches/10/main/tcptls.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/tcptls.c?view=diff&rev=367003&r1=367002&r2=367003
==============================================================================
--- branches/10/main/tcptls.c (original)
+++ branches/10/main/tcptls.c Fri May 18 12:00:14 2012
@@ -130,6 +130,9 @@
static void session_instance_destructor(void *obj)
{
struct ast_tcptls_session_instance *i = obj;
+ if (i->parent && i->parent->tls_cfg) {
+ ast_ssl_teardown(i->parent->tls_cfg);
+ }
ast_mutex_destroy(&i->lock);
}
@@ -311,6 +314,14 @@
SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
+ /* Get rid of an old SSL_CTX since we're about to
+ * allocate a new one
+ */
+ if (cfg->ssl_ctx) {
+ SSL_CTX_free(cfg->ssl_ctx);
+ cfg->ssl_ctx = NULL;
+ }
+
if (client) {
#ifndef OPENSSL_NO_SSL2
if (ast_test_flag(&cfg->flags, AST_SSL_SSLV2_CLIENT)) {
@@ -346,6 +357,8 @@
ast_verb(0, "SSL error loading cert file. <%s>", cfg->certfile);
sleep(2);
cfg->enabled = 0;
+ SSL_CTX_free(cfg->ssl_ctx);
+ cfg->ssl_ctx = NULL;
return 0;
}
}
@@ -355,6 +368,8 @@
ast_verb(0, "SSL error loading private key file. <%s>", tmpprivate);
sleep(2);
cfg->enabled = 0;
+ SSL_CTX_free(cfg->ssl_ctx);
+ cfg->ssl_ctx = NULL;
return 0;
}
}
@@ -365,6 +380,8 @@
ast_verb(0, "SSL cipher error <%s>", cfg->cipher);
sleep(2);
cfg->enabled = 0;
+ SSL_CTX_free(cfg->ssl_ctx);
+ cfg->ssl_ctx = NULL;
return 0;
}
}
@@ -382,6 +399,14 @@
int ast_ssl_setup(struct ast_tls_config *cfg)
{
return __ssl_setup(cfg, 0);
+}
+
+void ast_ssl_teardown(struct ast_tls_config *cfg)
+{
+ if (cfg->ssl_ctx) {
+ SSL_CTX_free(cfg->ssl_ctx);
+ cfg->ssl_ctx = NULL;
+ }
}
struct ast_tcptls_session_instance *ast_tcptls_client_start(struct ast_tcptls_session_instance *tcptls_session)
More information about the asterisk-commits
mailing list