Skip to content

Commit 2ad3c45

Browse files
authored
tr: generate an error if the input is a directory (#6855)
* tr: generate an error if the input is a directory tested by tests/misc/read-errors * tr: improve the test * tr: take the commentinto account
1 parent 37fb0a0 commit 2ad3c45

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

src/uu/tr/src/operation.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use std::{
2323
io::{BufRead, Write},
2424
ops::Not,
2525
};
26-
use uucore::error::UError;
26+
use uucore::error::{UError, UResult, USimpleError};
2727
use uucore::show_warning;
2828

2929
#[derive(Debug, Clone)]
@@ -608,23 +608,33 @@ impl SymbolTranslator for SqueezeOperation {
608608
}
609609
}
610610

611-
pub fn translate_input<T, R, W>(input: &mut R, output: &mut W, mut translator: T)
611+
pub fn translate_input<T, R, W>(input: &mut R, output: &mut W, mut translator: T) -> UResult<()>
612612
where
613613
T: SymbolTranslator,
614614
R: BufRead,
615615
W: Write,
616616
{
617617
let mut buf = Vec::new();
618618
let mut output_buf = Vec::new();
619+
619620
while let Ok(length) = input.read_until(b'\n', &mut buf) {
620621
if length == 0 {
621-
break;
622-
} else {
623-
let filtered = buf.iter().filter_map(|c| translator.translate(*c));
624-
output_buf.extend(filtered);
625-
output.write_all(&output_buf).unwrap();
622+
break; // EOF reached
626623
}
624+
625+
let filtered = buf.iter().filter_map(|&c| translator.translate(c));
626+
output_buf.extend(filtered);
627+
628+
if let Err(e) = output.write_all(&output_buf) {
629+
return Err(USimpleError::new(
630+
1,
631+
format!("{}: write error: {}", uucore::util_name(), e),
632+
));
633+
}
634+
627635
buf.clear();
628636
output_buf.clear();
629637
}
638+
639+
Ok(())
630640
}

src/uu/tr/src/tr.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,24 +132,24 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
132132
let delete_op = DeleteOperation::new(set1);
133133
let squeeze_op = SqueezeOperation::new(set2);
134134
let op = delete_op.chain(squeeze_op);
135-
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
135+
translate_input(&mut locked_stdin, &mut buffered_stdout, op)?;
136136
} else {
137137
let op = DeleteOperation::new(set1);
138-
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
138+
translate_input(&mut locked_stdin, &mut buffered_stdout, op)?;
139139
}
140140
} else if squeeze_flag {
141141
if sets_len < 2 {
142142
let op = SqueezeOperation::new(set1);
143-
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
143+
translate_input(&mut locked_stdin, &mut buffered_stdout, op)?;
144144
} else {
145145
let translate_op = TranslateOperation::new(set1, set2.clone())?;
146146
let squeeze_op = SqueezeOperation::new(set2);
147147
let op = translate_op.chain(squeeze_op);
148-
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
148+
translate_input(&mut locked_stdin, &mut buffered_stdout, op)?;
149149
}
150150
} else {
151151
let op = TranslateOperation::new(set1, set2)?;
152-
translate_input(&mut locked_stdin, &mut buffered_stdout, op);
152+
translate_input(&mut locked_stdin, &mut buffered_stdout, op)?;
153153
}
154154
Ok(())
155155
}

tests/by-util/test_tr.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ fn test_invalid_arg() {
1313
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
1414
}
1515

16+
#[test]
17+
fn test_invalid_input() {
18+
new_ucmd!()
19+
.args(&["1", "1", "<", "."])
20+
.fails()
21+
.code_is(1)
22+
.stderr_contains("tr: extra operand '<'");
23+
}
24+
1625
#[test]
1726
fn test_to_upper() {
1827
new_ucmd!()

0 commit comments

Comments
 (0)