From e5cb1a71aeb5327962b645909f359b77fce331ff Mon Sep 17 00:00:00 2001 From: oech3 <> Date: Sat, 13 Jun 2026 19:32:14 +0900 Subject: [PATCH] yes: catch strace injection with slow stdout --- src/uu/yes/src/yes.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/uu/yes/src/yes.rs b/src/uu/yes/src/yes.rs index b07b496345f..e0cdf283cd3 100644 --- a/src/uu/yes/src/yes.rs +++ b/src/uu/yes/src/yes.rs @@ -119,14 +119,19 @@ pub fn exec(bytes: &[u8]) -> io::Result<()> { && p_write.write_all(bytes).is_ok() && let Ok((broker_read, broker_write)) = pipe::() && Ok(bytes_len) == tee(&p_read, &broker_write, MAX_ROOTLESS_PIPE_SIZE) - && uucore::pipes::drain_pipe(&broker_read, &stdout, bytes_len)?.is_ok() + && let Ok(drained) = splice(&broker_read, &stdout, bytes_len) { - // fallback from tee() is possible since we did not send anything to stdout yet - while let Ok(mut remain) = tee(&p_read, &broker_write, MAX_ROOTLESS_PIPE_SIZE) { - debug_assert!(remain == bytes_len, "splice should cleanup pipe"); + let mut remain = bytes_len - drained; + 'splice: loop { while remain > 0 { remain -= splice(&broker_read, &stdout, remain)?; } + // fallback from tee() is possible since we did not send anything to stdout yet + let Ok(tee_len) = tee(&p_read, &broker_write, MAX_ROOTLESS_PIPE_SIZE) else { + break 'splice; + }; + debug_assert!(tee_len == bytes_len, "splice should cleanup pipe"); + remain = tee_len; } }