From ec2d118738facd1456a25bb67015e67094010b99 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 25 Apr 2024 00:43:47 -0400 Subject: [PATCH] fix splice_fd_to_stdinout() when stdin is closed We need to check when stdin has been closed - otherwise we'll spin because select() will return immediately. Signed-off-by: Kent Overstreet --- c_src/cmd_fsck.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/c_src/cmd_fsck.c b/c_src/cmd_fsck.c index 0d4070a3..05582d4a 100644 --- a/c_src/cmd_fsck.c +++ b/c_src/cmd_fsck.c @@ -60,14 +60,18 @@ static int splice_fd_to_stdinout(int fd) setnonblocking(STDIN_FILENO); setnonblocking(fd); + bool stdin_closed = false; + while (true) { fd_set fds; FD_ZERO(&fds); - FD_SET(STDIN_FILENO, &fds); FD_SET(fd, &fds); + if (!stdin_closed) + FD_SET(STDIN_FILENO, &fds); - select(fd + 1, &fds, NULL, NULL, NULL); + if (select(fd + 1, &fds, NULL, NULL, NULL) < 0) + die("select error: %m"); int r = do_splice(fd, STDOUT_FILENO); if (r < 0) @@ -78,6 +82,8 @@ static int splice_fd_to_stdinout(int fd) r = do_splice(STDIN_FILENO, fd); if (r < 0) return r; + if (r) + stdin_closed = true; } return close(fd);