diff options
author | Joshua Colp <jcolp@digium.com> | 2017-03-20 11:51:38 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-03-20 11:51:38 -0500 |
commit | 9613391868db2651376825345f5392a9e126b491 (patch) | |
tree | 0681630ab2776474ca83a8d901a43ab04a1b63f4 | |
parent | 265455bc2dc0b110a88df65209b281e846bc3e56 (diff) | |
parent | 38cebc73a33195fa14d6fa417284c59efe6111ee (diff) |
Merge "thread safety: Don't use getprotobyname()" into 13
-rw-r--r-- | channels/chan_skinny.c | 9 | ||||
-rw-r--r-- | include/asterisk/network.h | 5 | ||||
-rw-r--r-- | main/http.c | 16 | ||||
-rw-r--r-- | main/manager.c | 13 |
4 files changed, 14 insertions, 29 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 9cde77540..9c84eec30 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -7642,7 +7642,6 @@ static void *accept_thread(void *ignore) struct sockaddr_in sin; socklen_t sinlen; struct skinnysession *s; - struct protoent *p; int arg = 1; for (;;) { @@ -7659,12 +7658,10 @@ static void *accept_thread(void *ignore) continue; } - p = getprotobyname("tcp"); - if(p) { - if( setsockopt(as, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) { - ast_log(LOG_WARNING, "Failed to set Skinny tcp connection to TCP_NODELAY mode: %s\n", strerror(errno)); - } + if (setsockopt(as, IPPROTO_TCP, TCP_NODELAY, (char *) &arg, sizeof(arg)) < 0) { + ast_log(LOG_WARNING, "Failed to set TCP_NODELAY on Skinny TCP connection: %s\n", strerror(errno)); } + if (!(s = ast_calloc(1, sizeof(struct skinnysession)))) { close(as); ast_atomic_fetchadd_int(&unauth_sessions, -1); diff --git a/include/asterisk/network.h b/include/asterisk/network.h index 3371e5895..5216f4c61 100644 --- a/include/asterisk/network.h +++ b/include/asterisk/network.h @@ -86,6 +86,11 @@ const char *ast_inet_ntoa(struct in_addr ia); #endif #define inet_ntoa __dont__use__inet_ntoa__use__ast_inet_ntoa__instead__ +#ifdef getprotobyname +#undef getprotobyname +#endif +#define getprotobyname __getprotobyname_is_not_threadsafe__do_not_use__ + /*! \brief Compares the source address and port of two sockaddr_in */ static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct sockaddr_in *sin2) { diff --git a/main/http.c b/main/http.c index 155b04b78..80c7b3cb4 100644 --- a/main/http.c +++ b/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 */ diff --git a/main/manager.c b/main/manager.c index b8dbb1a04..0f7adf0c8 100644 --- a/main/manager.c +++ b/main/manager.c @@ -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 */ |