diff --git a/src/uu/sort/src/ext_sort/threaded.rs b/src/uu/sort/src/ext_sort/threaded.rs index 7dd089d0fe8..fec15dd0e14 100644 --- a/src/uu/sort/src/ext_sort/threaded.rs +++ b/src/uu/sort/src/ext_sort/threaded.rs @@ -293,13 +293,45 @@ fn write( separator: u8, ) -> UResult { let mut tmp_file = I::create(file, compress_prog)?; - write_lines(chunk.lines(), tmp_file.as_write(), separator); + write_lines(chunk.lines(), tmp_file.as_write(), separator)?; tmp_file.finished_writing() } -fn write_lines(lines: &[Line], writer: &mut T, separator: u8) { +fn write_lines(lines: &[Line], writer: &mut T, separator: u8) -> std::io::Result<()> { for s in lines { - writer.write_all(s.line).unwrap(); - writer.write_all(&[separator]).unwrap(); + writer.write_all(s.line)?; + writer.write_all(&[separator])?; + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::io::{self, Write}; + + use super::*; + + struct FailingWriter(io::ErrorKind); + + impl Write for FailingWriter { + fn write(&mut self, _buf: &[u8]) -> io::Result { + Err(io::Error::from(self.0)) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } + } + + #[test] + fn write_lines_propagates_write_errors() { + let lines = [Line { + line: b"line", + index: 0, + }]; + + let result = write_lines(&lines, &mut FailingWriter, b'\n'); + + assert_eq!(result.unwrap_err().kind(), io::ErrorKind::StorageFull); } }