Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/uu/dd/locales/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ dd-error-status-not-recognized = status=LEVEL not recognized -> { $level }
dd-error-unimplemented = feature not implemented on this system -> { $feature }
dd-error-bs-out-of-range = { $param }=N cannot fit into memory
dd-error-invalid-number = invalid number: ‘{ $input }’
dd-error-invalid-number-too-large = invalid number: { $input }: Value too large for defined data type

# Progress messages
dd-progress-records-in = { $complete }+{ $partial } records in
Expand Down
1 change: 1 addition & 0 deletions src/uu/dd/locales/fr-FR.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ dd-error-status-not-recognized = status=NIVEAU non reconnu -> { $level }
dd-error-unimplemented = fonctionnalité non implémentée sur ce système -> { $feature }
dd-error-bs-out-of-range = { $param }=N ne peut pas tenir en mémoire
dd-error-invalid-number = nombre invalide : ‘{ $input }‘
dd-error-invalid-number-too-large = nombre invalide : { $input }: Valeur trop grande pour le type défini de données

# Progress messages
dd-progress-records-in = { $complete }+{ $partial } enregistrements en entrée
Expand Down
12 changes: 12 additions & 0 deletions src/uu/dd/src/parseargs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ pub enum ParseError {
BsOutOfRange(String),
#[error("{}", translate!("dd-error-invalid-number", "input" => .0.clone()))]
InvalidNumber(String),
// Add surrounding quotes in here to get around this bug in Fluent:
// https://github.com/projectfluent/fluent-rs/issues/337
#[error("{}", translate!("dd-error-invalid-number-too-large", "input" => format!("‘{}’", .0.clone())))]
InvalidNumberTooLarge(String),
}

/// Contains a temporary state during parsing of the arguments
Expand Down Expand Up @@ -243,11 +247,19 @@ impl Parser {
.skip
.force_bytes_if(self.iflag.skip_bytes)
.to_bytes(ibs as u64);
// GNU coreutils has a limit of i64 (intmax_t)
if skip > i64::MAX as u64 {
return Err(ParseError::InvalidNumberTooLarge(format!("{skip}")));
}

let seek = self
.seek
.force_bytes_if(self.oflag.seek_bytes)
.to_bytes(obs as u64);
// GNU coreutils has a limit of i64 (intmax_t)
if seek > i64::MAX as u64 {
return Err(ParseError::InvalidNumberTooLarge(format!("{seek}")));
}

let count = self.count.map(|c| c.force_bytes_if(self.iflag.count_bytes));

Expand Down
20 changes: 20 additions & 0 deletions tests/by-util/test_dd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1830,3 +1830,23 @@ fn test_oflag_direct_partial_block() {
at.remove(input_file);
at.remove(output_file);
}

#[test]
fn test_skip_overflow() {
new_ucmd!()
.args(&["bs=1", "skip=9223372036854775808", "count=0"])
.fails()
.stderr_contains(
"dd: invalid number: ‘9223372036854775808’: Value too large for defined data type\n",
);
}

#[test]
fn test_seek_overflow() {
new_ucmd!()
.args(&["bs=1", "seek=9223372036854775809", "count=0"])
.fails()
.stderr_contains(
"dd: invalid number: ‘9223372036854775809’: Value too large for defined data type\n",
);
}
Loading