From ca5f7d2b4b1d00020a56dcfd6319f0acb7157d27 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 10 Feb 2024 19:16:16 +0100 Subject: [PATCH] osdep: fix infinite loop when cancelling subprocess Due to the state of the other fds/pipes it cannot safely be assumed that the loop breaks on its own. --- osdep/subprocess-posix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osdep/subprocess-posix.c b/osdep/subprocess-posix.c index 0656ec5df1..c75d267cdd 100644 --- a/osdep/subprocess-posix.c +++ b/osdep/subprocess-posix.c @@ -281,7 +281,7 @@ void mp_subprocess2(struct mp_subprocess_opts *opts, if (pid) kill(pid, SIGKILL); killed_by_us = true; - break; + goto break_poll; } struct mp_subprocess_fd *fd = &opts->fds[n]; if (fd->on_read) { @@ -316,6 +316,8 @@ void mp_subprocess2(struct mp_subprocess_opts *opts, } } +break_poll: + // Note: it can happen that a child process closes the pipe, but does not // terminate yet. In this case, we would have to run waitpid() in // a separate thread and use pthread_cancel(), or use other weird