Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2016-03-25 14:10:38 +0300
committerRoman Arutyunyan <arut@nginx.com>2016-03-25 14:10:38 +0300
commit030a1f959c9c673258fe53f968fab04fc9214b86 (patch)
tree7a9983262b05734e453c090a529b4bbd9e96b2ca /src/core/ngx_connection.c
parent818ebb3492d7def9291f9338242e2f62a7ffbaa5 (diff)
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/core/ngx_connection.c')
-rw-r--r--src/core/ngx_connection.c16
1 files changed, 16 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);