diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index c1838d1db..f2d2f3aa9 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -683,11 +683,17 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } else if matches.get_flag(options::BLOCK_SIZE_1M) { SizeFormat::BlockSize(1024 * 1024) } else { - SizeFormat::BlockSize(read_block_size( - matches - .get_one::(options::BLOCK_SIZE) - .map(AsRef::as_ref), - )?) + let block_size_str = matches.get_one::(options::BLOCK_SIZE); + let block_size = read_block_size(block_size_str.map(AsRef::as_ref))?; + if block_size == 0 { + return Err(std::io::Error::other(format!( + "invalid --{} argument {}", + options::BLOCK_SIZE, + block_size_str.map_or("???BUG", |v| v).quote() + )) + .into()); + } + SizeFormat::BlockSize(block_size) }; let traversal_options = TraversalOptions { diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index d651bfcab..668c1ed1b 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -1248,3 +1248,19 @@ fn test_du_no_deduplicated_input_args() { .collect(); assert_eq!(result_seq, ["2\td", "2\td", "2\td"]); } + +#[test] +fn test_du_blocksize_zero_do_not_panic() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + at.write("foo", "some content"); + for block_size in ["0", "00", "000", "0x0"] { + ts.ucmd() + .arg(format!("-B{block_size}")) + .arg("foo") + .fails() + .stderr_only(format!( + "du: invalid --block-size argument '{block_size}'\n" + )); + } +}