Skip to content

Commit

Permalink
Fixed socket inheritance on reload and binary upgrade.
Browse files Browse the repository at this point in the history
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)".
  • Loading branch information
arut committed Mar 25, 2016
1 parent 818ebb3 commit 030a1f9
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/core/ngx_connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/core/ngx_cycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 030a1f9

Please sign in to comment.