1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 19:47:45 +00:00

truncate: add a division by zero error

Add an error for division by zero. Previously, running `truncate -s /0
file` or `-s %0` would panic due to division by zero. After this
change, it writes an error message "division by zero" to stderr and
terminates with an error code.
This commit is contained in:
Jeffrey Finkelstein 2022-01-27 21:03:38 -05:00
parent 1074deeb03
commit 1e5e637990
2 changed files with 37 additions and 0 deletions

View file

@ -202,6 +202,9 @@ fn truncate_reference_and_size(
}
Ok(m) => m,
};
if let TruncateMode::RoundDown(0) | TruncateMode::RoundUp(0) = mode {
return Err(USimpleError::new(1, "division by zero"));
}
let metadata = metadata(rfilename).map_err(|e| match e.kind() {
ErrorKind::NotFound => USimpleError::new(
1,
@ -271,6 +274,9 @@ fn truncate_reference_file_only(
fn truncate_size_only(size_string: &str, filenames: Vec<String>, create: bool) -> UResult<()> {
let mode = parse_mode_and_size(size_string)
.map_err(|e| USimpleError::new(1, format!("Invalid number: {}", e)))?;
if let TruncateMode::RoundDown(0) | TruncateMode::RoundUp(0) = mode {
return Err(USimpleError::new(1, "division by zero"));
}
for filename in &filenames {
let fsize = match metadata(filename) {
Ok(m) => m.len(),

View file

@ -346,3 +346,34 @@ fn test_new_file_no_create() {
.no_stderr();
assert!(!at.file_exists(filename));
}
#[test]
fn test_division_by_zero_size_only() {
new_ucmd!()
.args(&["-s", "/0", "file"])
.fails()
.no_stdout()
.stderr_contains("division by zero");
new_ucmd!()
.args(&["-s", "%0", "file"])
.fails()
.no_stdout()
.stderr_contains("division by zero");
}
#[test]
fn test_division_by_zero_reference_and_size() {
let (at, mut ucmd) = at_and_ucmd!();
at.make_file(FILE1);
ucmd.args(&["-r", FILE1, "-s", "/0", "file"])
.fails()
.no_stdout()
.stderr_contains("division by zero");
let (at, mut ucmd) = at_and_ucmd!();
at.make_file(FILE1);
ucmd.args(&["-r", FILE1, "-s", "%0", "file"])
.fails()
.no_stdout()
.stderr_contains("division by zero");
}