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.
Bu işleme şunda yer alıyor:
ebeveyn
cc83b8d344
işleme
51e2d6d356
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Yükleniyor…
Yeni konuda referans
Bir kullanıcı engelle