From f5db8d64828db756b80b6022322265a2b4f1c11b Mon Sep 17 00:00:00 2001 From: Rory Dudley Date: Sat, 6 Apr 2024 23:32:30 -0600 Subject: Capture STDOUT as bytes, and convert to string when necessary Previously, the recite() function created the 'out' variable, which was a String, that got passed to the various incant functions, in order to capture STDOUT in certain situations. In cases where STDOUT was captured, it was first converted to a String, and then appended to the 'out' variable, by means of String::from_utf8_lossy(). This works for basic text, however, does NOT work for binary data. This becomes problematic, when for example, downling a tar file with curl/wget, that is then piped ('|') to the tar program. Using from_utf8_lossy() in this case can corrupt the tar file. This patch makes it so that out is stored as bytes by default, and only converted to a String when necessary. --- src/poem/recite/ps.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/poem/recite/ps.rs') diff --git a/src/poem/recite/ps.rs b/src/poem/recite/ps.rs index 61ed66d..5700ae8 100644 --- a/src/poem/recite/ps.rs +++ b/src/poem/recite/ps.rs @@ -17,7 +17,7 @@ macro_rules! task { .spawn()?; let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?; - stdin.write_all(&$out.as_bytes())?; + stdin.write_all(&$out)?; $out.clear(); child @@ -50,7 +50,7 @@ macro_rules! ctask { .spawn()?; let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?; - stdin.write_all(&$out.as_bytes())?; + stdin.write_all(&$out)?; $out.clear(); child @@ -83,7 +83,7 @@ macro_rules! btask { .spawn()?; let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?; - stdin.write_all(&$out.as_bytes())?; + stdin.write_all(&$out)?; $out.clear(); child @@ -119,7 +119,7 @@ macro_rules! iobtask { .spawn()?; let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?; - stdin.write_all(&$out.as_bytes())?; + stdin.write_all(&$out)?; $out.clear(); child -- cgit v1.2.3