diff options
author | Roman Arutyunyan <arut@nginx.com> | 2016-03-25 14:10:38 +0300 |
---|---|---|
committer | Roman Arutyunyan <arut@nginx.com> | 2016-03-25 14:10:38 +0300 |
commit | 030a1f959c9c673258fe53f968fab04fc9214b86 (patch) | |
tree | 7a9983262b05734e453c090a529b4bbd9e96b2ca /src | |
parent | 818ebb3492d7def9291f9338242e2f62a7ffbaa5 (diff) | |
download | nginx-030a1f959c9c673258fe53f968fab04fc9214b86.tar.gz nginx-030a1f959c9c673258fe53f968fab04fc9214b86.zip |
Fixed socket inheritance on reload and binary upgrade.
On nginx reload or binary upgrade, an attempt is made to inherit listen sockets
from the previous configuration. Previously, no check for socket type was made
and the inherited socket could have the wrong type. On binary upgrade, socket
type was not detected at all. Wrong socket type could lead to errors on that
socket due to different logic and unsupported syscalls. For example, a UDP
socket, inherited as TCP, lead to the following error after arrival of a
datagram: "accept() failed (102: Operation not supported on socket)".
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ngx_connection.c | 16 | ||||
-rw-r--r-- | src/core/ngx_cycle.c | 4 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c index 29aacc035..572def263 100644 --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -210,6 +210,18 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle) olen = sizeof(int); + if (getsockopt(ls[i].fd, SOL_SOCKET, SO_TYPE, (void *) &ls[i].type, + &olen) + == -1) + { + ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, + "getsockopt(SO_TYPE) %V failed", &ls[i].addr_text); + ls[i].ignore = 1; + continue; + } + + olen = sizeof(int); + if (getsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, (void *) &ls[i].rcvbuf, &olen) == -1) @@ -274,6 +286,10 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle) #endif + if (ls[i].type != SOCK_STREAM) { + continue; + } + #if (NGX_HAVE_TCP_FASTOPEN) olen = sizeof(int); diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c index f1032668a..5785eb5b5 100644 --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -512,6 +512,10 @@ ngx_init_cycle(ngx_cycle_t *old_cycle) continue; } + if (ls[i].type != nls[n].type) { + continue; + } + if (ngx_cmp_sockaddr(nls[n].sockaddr, nls[n].socklen, ls[i].sockaddr, ls[i].socklen, 1) == NGX_OK) |