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.
This commit is contained in:
Max Romanov
2021-07-01 16:23:51 +03:00
parent 210c8bbd81
commit 2ac9c627aa
2 changed files with 32 additions and 7 deletions

View File

@@ -31,6 +31,20 @@ NGINX Unit updated to 1.25.0.
date="" time=""
packager="Andrei Belov <defan@nginx.com>">
<change type="bugfix">
<para>
the router process could crash on TLS connection open when multiple listeners
with TLS certificate configured; the bug had appeared in 1.23.0.
</para>
</change>
<change type="bugfix">
<para>
a descriptor and memory leak occurred in the router process when an app
process stopped or crashed.
</para>
</change>
</changes>
@@ -44,13 +58,6 @@ Initial release of Java 17 module for NGINX Unit.
</para>
</change>
<change type="bugfix">
<para>
the router process could crash on TLS connection open when multiple listeners
with TLS certificate configured; the bug had appeared in 1.23.0.
</para>
</change>
</changes>

View File

@@ -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;
}