diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index adfb74128..7ec28e491 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -227,8 +227,20 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { DateSource::Human(relative_time) => { // Get the current DateTime for things like "1 year ago" let current_time = DateTime::::from(Local::now()); - let iter = std::iter::once(Ok(current_time + relative_time)); - Box::new(iter) + // double check the result is overflow or not of the current_time + relative_time + // it may cause a panic of chrono::datetime::DateTime add + match current_time.checked_add_signed(relative_time) { + Some(date) => { + let iter = std::iter::once(Ok(date)); + Box::new(iter) + } + None => { + return Err(USimpleError::new( + 1, + format!("invalid date {}", relative_time), + )); + } + } } DateSource::File(ref path) => { if path.is_dir() { diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 669f02e33..efd16d5c7 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -395,3 +395,12 @@ fn test_invalid_date_string() { .no_stdout() .stderr_contains("invalid date"); } + +#[test] +fn test_date_overflow() { + new_ucmd!() + .arg("-d68888888888888sms") + .fails() + .no_stdout() + .stderr_contains("invalid date"); +}