diff options
author | Richard Mudgett <rmudgett@digium.com> | 2017-04-10 17:45:35 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2017-04-11 11:13:53 -0500 |
commit | bb8cd2add7ad612bb7e665db90eb8de4f4ba6294 (patch) | |
tree | dce42dca8b4c749910078522974c97b083dd7a13 /main/tcptls.c | |
parent | bbbd262ec0f05c00f640c4594b5ed5e48b8f86ef (diff) |
tcptls.c: Cleanup TCP/TLS listener thread on abnormal exit.
Temporarily running out of file descriptors should not terminate the
listener thread. Otherwise, when there becomes more file descriptors
available, nothing is listening.
* Added EMFILE exception to abnormal thread exit.
* Added an abnormal TCP/TLS listener exit error message.
* Closed the TCP/TLS listener socket on abnormal exit so Asterisk does not
appear dead if something tries to connect to the socket.
ASTERISK-26903 #close
Change-Id: I10f2f784065136277f271159f0925927194581b5
Diffstat (limited to 'main/tcptls.c')
-rw-r--r-- | main/tcptls.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/main/tcptls.c b/main/tcptls.c index c46b8df43..3fd3c5312 100644 --- a/main/tcptls.c +++ b/main/tcptls.c @@ -761,14 +761,23 @@ void *ast_tcptls_server_root(void *data) } i = ast_wait_for_input(desc->accept_fd, desc->poll_timeout); if (i <= 0) { + /* Prevent tight loop from hogging CPU */ + usleep(1); continue; } fd = ast_accept(desc->accept_fd, &addr); if (fd < 0) { - if ((errno != EAGAIN) && (errno != EWOULDBLOCK) && (errno != EINTR) && (errno != ECONNABORTED)) { - ast_log(LOG_ERROR, "Accept failed: %s\n", strerror(errno)); - break; + if (errno != EAGAIN + && errno != EWOULDBLOCK + && errno != EINTR + && errno != ECONNABORTED) { + ast_log(LOG_ERROR, "TCP/TLS accept failed: %s\n", strerror(errno)); + if (errno != EMFILE) { + break; + } } + /* Prevent tight loop from hogging CPU */ + usleep(1); continue; } tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor); @@ -793,11 +802,21 @@ 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_log(LOG_ERROR, "TCP/TLS unable to launch helper thread: %s\n", + strerror(errno)); ast_tcptls_close_session_file(tcptls_session); ao2_ref(tcptls_session, -1); } } + + ast_log(LOG_ERROR, "TCP/TLS listener thread ended abnormally\n"); + + /* Close the listener socket so Asterisk doesn't appear dead. */ + fd = desc->accept_fd; + desc->accept_fd = -1; + if (0 <= fd) { + close(fd); + } return NULL; } |