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:
parent
1074deeb03
commit
1e5e637990
2 changed files with 37 additions and 0 deletions
|
@ -202,6 +202,9 @@ fn truncate_reference_and_size(
|
||||||
}
|
}
|
||||||
Ok(m) => m,
|
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() {
|
let metadata = metadata(rfilename).map_err(|e| match e.kind() {
|
||||||
ErrorKind::NotFound => USimpleError::new(
|
ErrorKind::NotFound => USimpleError::new(
|
||||||
1,
|
1,
|
||||||
|
@ -271,6 +274,9 @@ fn truncate_reference_file_only(
|
||||||
fn truncate_size_only(size_string: &str, filenames: Vec<String>, create: bool) -> UResult<()> {
|
fn truncate_size_only(size_string: &str, filenames: Vec<String>, create: bool) -> UResult<()> {
|
||||||
let mode = parse_mode_and_size(size_string)
|
let mode = parse_mode_and_size(size_string)
|
||||||
.map_err(|e| USimpleError::new(1, format!("Invalid number: {}", e)))?;
|
.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 {
|
for filename in &filenames {
|
||||||
let fsize = match metadata(filename) {
|
let fsize = match metadata(filename) {
|
||||||
Ok(m) => m.len(),
|
Ok(m) => m.len(),
|
||||||
|
|
|
@ -346,3 +346,34 @@ fn test_new_file_no_create() {
|
||||||
.no_stderr();
|
.no_stderr();
|
||||||
assert!(!at.file_exists(filename));
|
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");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue