diff options
author | Max Romanov <max.romanov@nginx.com> | 2021-07-01 16:23:51 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2021-07-01 16:23:51 +0300 |
commit | 2ac9c627aa6aa736f3df9f426e741642694ac911 (patch) | |
tree | fbf5ffc64065875c847f2e838246f7c59222757b /src/nxt_port_socket.c | |
parent | 210c8bbd81a8836bffee221215effa00018868cd (diff) | |
download | unit-2ac9c627aa6aa736f3df9f426e741642694ac911.tar.gz unit-2ac9c627aa6aa736f3df9f426e741642694ac911.tar.bz2 |
Fixing memory and descriptor leakage in case of port send failure.
In rare cases, when the destination process had finished running but no
notification of this was received yet, send could fail with an error, and the
send message structure with file descriptors could leak.
The leakage was periodically reproduced by respawn tests on FreeBSD 12.
Diffstat (limited to 'src/nxt_port_socket.c')
-rw-r--r-- | src/nxt_port_socket.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/nxt_port_socket.c b/src/nxt_port_socket.c index 3cf2e79a..843728a4 100644 --- a/src/nxt_port_socket.c +++ b/src/nxt_port_socket.c @@ -524,6 +524,24 @@ next_fragment: } else { if (nxt_slow_path(n == NXT_ERROR)) { + if (msg->link.next == NULL) { + if (msg->close_fd) { + if (msg->fd[0] != -1) { + nxt_fd_close(msg->fd[0]); + + msg->fd[0] = -1; + } + + if (msg->fd[1] != -1) { + nxt_fd_close(msg->fd[1]); + + msg->fd[1] = -1; + } + } + + nxt_port_release_send_msg(msg); + } + goto fail; } |