diff --git a/qrexec/qrexec-agent-data.c b/qrexec/qrexec-agent-data.c index e44024d..61b55f4 100644 --- a/qrexec/qrexec-agent-data.c +++ b/qrexec/qrexec-agent-data.c @@ -403,6 +403,26 @@ int process_child_io(libvchan_t *data_vchan, } } } + /* make sure that all the pipes/sockets are closed, so the child process + * (if any) will know that the connection is terminated */ + if (stdout_fd != -1) { + if (shutdown(stdout_fd, SHUT_RD) < 0) { + if (errno == ENOTSOCK) + close(stdout_fd); + } + stdout_fd = -1; + } + if (stdin_fd != -1) { + if (shutdown(stdin_fd, SHUT_WR) < 0) { + if (errno == ENOTSOCK) + close(stdin_fd); + } + stdin_fd = -1; + } + if (stderr_fd != -1) { + close(stderr_fd); + stderr_fd = -1; + } return child_process_status; }