diff options
author | Richard Mudgett <rmudgett@digium.com> | 2017-02-17 16:57:54 -0600 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2017-02-17 17:00:24 -0600 |
commit | 0b427f9b595c28a91e51c8dd6f7a7f0c9cac4d60 (patch) | |
tree | 437a3e321851590c381cdf60e77f21396280b5a7 /main/tcptls.c | |
parent | 8851c3e0885cb704a5a6159a51768ea5297e9b10 (diff) |
tcptls.c: Add some missing allocation failure checks.
* Fix tcptls_session ref and fd leak in ast_tcptls_server_root().
Change-Id: I0ddf01cd3c10d3b6666d7bf68d4e206a37f4fbdb
Diffstat (limited to 'main/tcptls.c')
-rw-r--r-- | main/tcptls.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/main/tcptls.c b/main/tcptls.c index 7f1421db8..1377dd72d 100644 --- a/main/tcptls.c +++ b/main/tcptls.c @@ -240,20 +240,23 @@ void *ast_tcptls_server_root(void *data) } tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor); if (!tcptls_session) { - ast_log(LOG_WARNING, "No memory for new session: %s\n", strerror(errno)); - if (close(fd)) { - ast_log(LOG_ERROR, "close() failed: %s\n", strerror(errno)); - } + close(fd); continue; } tcptls_session->overflow_buf = ast_str_create(128); + if (!tcptls_session->overflow_buf) { + ao2_ref(tcptls_session, -1); + close(fd); + continue; + } flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); tcptls_session->stream = ast_iostream_from_fd(&fd); if (!tcptls_session->stream) { - ast_log(LOG_WARNING, "No memory for new session iostream\n"); + ao2_ref(tcptls_session, -1); + close(fd); continue; } @@ -265,7 +268,6 @@ void *ast_tcptls_server_root(void *data) /* This thread is now the only place that controls the single ref to tcptls_session */ if (ast_pthread_create_detached_background(&launched, NULL, handle_tcptls_connection, tcptls_session)) { ast_log(LOG_ERROR, "Unable to launch helper thread: %s\n", strerror(errno)); - ast_tcptls_close_session_file(tcptls_session); ao2_ref(tcptls_session, -1); } } @@ -561,11 +563,15 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s } } - if (!(tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor))) { + tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor); + if (!tcptls_session) { goto error; } tcptls_session->overflow_buf = ast_str_create(128); + if (!tcptls_session->overflow_buf) { + goto error; + } tcptls_session->client = 1; tcptls_session->stream = ast_iostream_from_fd(&fd); if (!tcptls_session->stream) { @@ -584,9 +590,7 @@ struct ast_tcptls_session_instance *ast_tcptls_client_create(struct ast_tcptls_s error: close(desc->accept_fd); desc->accept_fd = -1; - if (tcptls_session) { - ao2_ref(tcptls_session, -1); - } + ao2_cleanup(tcptls_session); return NULL; } |