mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user