summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_port_socket.c
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2021-07-01 16:23:51 +0300
committerMax Romanov <max.romanov@nginx.com>2021-07-01 16:23:51 +0300
commit2ac9c627aa6aa736f3df9f426e741642694ac911 (patch)
treefbf5ffc64065875c847f2e838246f7c59222757b /src/nxt_port_socket.c
parent210c8bbd81a8836bffee221215effa00018868cd (diff)
downloadunit-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.c18
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;
}