瀏覽代碼

qrexec: make sure that all the pipes/sockets are closed on cleanup

This will ensure that the child process will receive info that the
connection is closed. Otherwise it could hang on write() or in some
cases read() - on its stdin/stdout.

Thanks @adrelanos for help with debugging.
Marek Marczykowski-Górecki 8 年之前
父節點
當前提交
51e2d6d356
共有 1 個文件被更改,包括 20 次插入0 次删除
  1. 20 0
      qrexec/qrexec-agent-data.c

+ 20 - 0
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;
 }