Skip to content

Commit

Permalink
join: "support" field numbers larger than usize::MAX
Browse files Browse the repository at this point in the history
They silently get folded to usize::MAX, which is the official GNU behavior.
  • Loading branch information
jtracey committed Jan 17, 2022
1 parent 4fc47ab commit 4d35f2e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/uu/join/src/join.rs
Original file line number Diff line number Diff line change
Expand Up @@ -775,8 +775,11 @@ fn get_field_number(keys: Option<usize>, key: Option<usize>) -> UResult<usize> {
/// Parse the specified field string as a natural number and return
/// the zero-based field number.
fn parse_field_number(value: &str) -> UResult<usize> {
// TODO: use ParseIntError.kind() once MSRV >= 1.55
let overflow = "184467440737095516150".parse::<usize>().err().unwrap();
match value.parse::<usize>() {
Ok(result) if result > 0 => Ok(result - 1),
Err(ref e) if *e == overflow => Ok(usize::MAX),
_ => Err(USimpleError::new(
1,
format!("invalid field number: {}", value.quote()),
Expand Down
21 changes: 21 additions & 0 deletions tests/by-util/test_join.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,27 @@ fn different_field() {
.stdout_only_fixture("different_field.expected");
}

#[test]
fn out_of_bounds_fields() {
new_ucmd!()
.arg("fields_1.txt")
.arg("fields_4.txt")
.arg("-1")
.arg("3")
.arg("-2")
.arg("5")
.succeeds()
.stdout_only_fixture("out_of_bounds_fields.expected");

new_ucmd!()
.arg("fields_1.txt")
.arg("fields_4.txt")
.arg("-j")
.arg("100000000000000000000") // > usize::MAX for 64 bits
.succeeds()
.stdout_only_fixture("out_of_bounds_fields.expected");
}

#[test]
fn unpaired_lines() {
new_ucmd!()
Expand Down
25 changes: 25 additions & 0 deletions tests/fixtures/join/out_of_bounds_fields.expected
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
1 2 c 1 cd
1 3 d 2 de
1 5 e 3 ef
1 7 f 4 fg
1 11 g 5 gh
2 2 c 1 cd
2 3 d 2 de
2 5 e 3 ef
2 7 f 4 fg
2 11 g 5 gh
3 2 c 1 cd
3 3 d 2 de
3 5 e 3 ef
3 7 f 4 fg
3 11 g 5 gh
5 2 c 1 cd
5 3 d 2 de
5 5 e 3 ef
5 7 f 4 fg
5 11 g 5 gh
8 2 c 1 cd
8 3 d 2 de
8 5 e 3 ef
8 7 f 4 fg
8 11 g 5 gh

0 comments on commit 4d35f2e

Please sign in to comment.