dd: a zero factor no longer short-circuits the multiplier
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 24.1k
- Forks
- 2k
- Avg merge
- 1d 5h
- Merged PRs (30d)
- 365
Description
GNU dd stops at the zero factor in a multiplier expression and never looks at
the rest. We now parse every factor first, so a huge one fails before the zero
is taken into account:
$ LC_ALL=C dd count=00x9999999999999999999999999999999999999999999999999999999999999 </dev/null
uutils: dd: invalid number: '00x999…': Value too large for defined data type
exit=1
GNU: 0+0 records in
0+0 records out
0 bytes copied, 1.627e-05 s, 0.0 kB/s
exit=0
This makes tests/dd/misc.sh fail.
It started with 7f9b9a6f0 ("dd: reject a number that does not fit in u64"),
which turned ParseSizeError::SizeTooBig into an error instead of u64::MAX
in parse_bytes_with_opt_multiplier. The zero factor case wasn't covered.
Note that fixing this alone doesn't make tests/dd/misc.sh pass the test then
reaches a second difference, dd: failed to seek in output file: Illegal seek.
Compared against GNU coreutils 9.10.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with parse_bytes_with_opt_multiplier and the change from 7f9b9a6f0, then inspect the failing case in tests/dd/misc.sh. Compare the zero-factor behavior with GNU coreutils 9.10 and verify that an oversized later factor is not rejected after a zero factor. The separate failed-seek difference is outside this issue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 78/100