Merged revisions 220365 via svnmerge from

https://origsvn.digium.com/svn/asterisk/trunk

........
  r220365 | dvossel | 2009-09-24 15:37:20 -0500 (Thu, 24 Sep 2009) | 8 lines
  
  fixes tcptls_session memory leak caused by ref count error
  
  (closes issue #15939)
  Reported by: dvossel
  
  Review: https://reviewboard.asterisk.org/r/375/
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@220371 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.1
David Vossel 16 years ago
parent 698a9ede87
commit b4e48dc19e

@ -122,6 +122,8 @@ static void session_instance_destructor(void *obj)
* creates a FILE * from the fd passed by the accept thread. * creates a FILE * from the fd passed by the accept thread.
* This operation is potentially expensive (certificate verification), * This operation is potentially expensive (certificate verification),
* so we do it in the child thread context. * so we do it in the child thread context.
*
* \note must decrement ref count before returning NULL on error
*/ */
static void *handle_tls_connection(void *data) static void *handle_tls_connection(void *data)
{ {
@ -196,6 +198,7 @@ static void *handle_tls_connection(void *data)
if (peer) if (peer)
X509_free(peer); X509_free(peer);
fclose(tcptls_session->f); fclose(tcptls_session->f);
ao2_ref(tcptls_session, -1);
return NULL; return NULL;
} }
} }
@ -262,6 +265,7 @@ void *ast_tcptls_server_root(void *data)
tcptls_session->client = 0; tcptls_session->client = 0;
/* This thread is now the only place that controls the single ref to tcptls_session */
if (ast_pthread_create_detached_background(&launched, NULL, handle_tls_connection, tcptls_session)) { if (ast_pthread_create_detached_background(&launched, NULL, handle_tls_connection, tcptls_session)) {
ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno)); ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno));
close(tcptls_session->fd); close(tcptls_session->fd);
@ -391,8 +395,9 @@ struct ast_tcptls_session_instance *ast_tcptls_client_start(struct ast_tcptls_se
__ssl_setup(desc->tls_cfg, 1); __ssl_setup(desc->tls_cfg, 1);
} }
ao2_ref(tcptls_session, +1); /* handle_tls_connection controls the single ref to tcptls_session. If
if (!handle_tls_connection(tcptls_session)) * tcptls_session returns NULL then the session has been destroyed */
if (!(tcptls_session = handle_tls_connection(tcptls_session)))
goto error; goto error;
return tcptls_session; return tcptls_session;

Loading…
Cancel
Save