mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
thread safety: Don't use getprotobyname()
POSIX does not require getprotobyname() to be thread safe and some implementations use static memory which causes issues when multiple threads are used. Further, our usage of it today is just to ultimately get IPPROTO_TCP for calls to setsockopt(). So instead we just use IPPROTO_TCP directly. Change-Id: I2e14e58674808f7ce99b2f5e900d0f90d0d8da48
This commit is contained in:
16
main/http.c
16
main/http.c
@@ -1915,8 +1915,7 @@ static int httpd_process_request(struct ast_tcptls_session_instance *ser)
|
||||
static void *httpd_helper_thread(void *data)
|
||||
{
|
||||
struct ast_tcptls_session_instance *ser = data;
|
||||
struct protoent *p;
|
||||
int flags;
|
||||
int flags = 1;
|
||||
int timeout;
|
||||
|
||||
if (!ser || !ser->f) {
|
||||
@@ -1936,17 +1935,8 @@ static void *httpd_helper_thread(void *data)
|
||||
* This is necessary to prevent delays (caused by buffering) as we
|
||||
* write to the socket in bits and pieces.
|
||||
*/
|
||||
p = getprotobyname("tcp");
|
||||
if (p) {
|
||||
int arg = 1;
|
||||
|
||||
if (setsockopt(ser->fd, p->p_proto, TCP_NODELAY, (char *) &arg, sizeof(arg) ) < 0) {
|
||||
ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on HTTP connection: %s\n", strerror(errno));
|
||||
ast_log(LOG_WARNING, "Some HTTP requests may be slow to respond.\n");
|
||||
}
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on HTTP connection, getprotobyname(\"tcp\") failed\n");
|
||||
ast_log(LOG_WARNING, "Some HTTP requests may be slow to respond.\n");
|
||||
if (setsockopt(ser->fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flags, sizeof(flags)) < 0) {
|
||||
ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on HTTP connection: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
/* make sure socket is non-blocking */
|
||||
|
@@ -6591,10 +6591,9 @@ static void *session_do(void *data)
|
||||
struct mansession s = {
|
||||
.tcptls_session = data,
|
||||
};
|
||||
int flags;
|
||||
int flags = 1;
|
||||
int res;
|
||||
struct ast_sockaddr ser_remote_address_tmp;
|
||||
struct protoent *p;
|
||||
|
||||
if (ast_atomic_fetchadd_int(&unauth_sessions, +1) >= authlimit) {
|
||||
fclose(ser->f);
|
||||
@@ -6614,14 +6613,8 @@ static void *session_do(void *data)
|
||||
/* here we set TCP_NODELAY on the socket to disable Nagle's algorithm.
|
||||
* This is necessary to prevent delays (caused by buffering) as we
|
||||
* write to the socket in bits and pieces. */
|
||||
p = getprotobyname("tcp");
|
||||
if (p) {
|
||||
int arg = 1;
|
||||
if( setsockopt(ser->fd, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
|
||||
ast_log(LOG_WARNING, "Failed to set manager tcp connection to TCP_NODELAY mode: %s\nSome manager actions may be slow to respond.\n", strerror(errno));
|
||||
}
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Failed to set manager tcp connection to TCP_NODELAY, getprotobyname(\"tcp\") failed\nSome manager actions may be slow to respond.\n");
|
||||
if (setsockopt(ser->fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flags, sizeof(flags)) < 0) {
|
||||
ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on manager connection: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
/* make sure socket is non-blocking */
|
||||
|
Reference in New Issue
Block a user