Unverified Commit 9bfd1b2c authored by 82marbag's avatar 82marbag Committed by GitHub
Browse files

Forbid inf/nan in epochs (#1650)



* Forbid inf/nan in epochs

Signed-off-by: default avatarDaniele Ahmed <ahmeddan@amazon.de>
parent 9c824df3
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -669,9 +669,6 @@ class ServerProtocolTestGenerator(
            FailingTest(RestJson, "RestJsonMalformedSetDuplicateItems", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonMalformedSetNullItem", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonHeaderMalformedStringInvalidBase64MediaType_case1", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case5", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case7", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonBodyTimestampDefaultRejectsMalformedEpochSeconds_case9", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonMalformedUnionNoFieldsSet", TestType.MalformedRequest),
            FailingTest(RestJson, "RestJsonMalformedSetDuplicateBlobs", TestType.MalformedRequest),

+32 −3
Original line number Diff line number Diff line
@@ -216,9 +216,26 @@ pub fn expect_timestamp_or_null(
    timestamp_format: Format,
) -> Result<Option<DateTime>, Error> {
    Ok(match timestamp_format {
        Format::EpochSeconds => {
            expect_number_or_null(token)?.map(|v| DateTime::from_secs_f64(v.to_f64_lossy()))
        Format::EpochSeconds => expect_number_or_null(token)?
            .map(|v| v.to_f64_lossy())
            .map(|v| {
                if v.is_nan() {
                    Err(Error::new(
                        ErrorReason::Custom(Cow::Owned("NaN is not a valid epoch".to_string())),
                        None,
                    ))
                } else if v.is_infinite() {
                    Err(Error::new(
                        ErrorReason::Custom(Cow::Owned(
                            "Infinity is not a valid epoch".to_string(),
                        )),
                        None,
                    ))
                } else {
                    Ok(DateTime::from_secs_f64(v))
                }
            })
            .transpose()?,
        Format::DateTime | Format::HttpDate => expect_string_or_null(token)?
            .map(|v| DateTime::from_str(v.as_escaped_str(), timestamp_format))
            .transpose()
@@ -578,6 +595,18 @@ pub mod test {
            Ok(None),
            expect_timestamp_or_null(value_null(0), Format::HttpDate)
        );
        for &invalid in &["NaN", "Infinity", "-Infinity"] {
            assert_eq!(
                Err(Error::new(
                    ErrorReason::Custom(Cow::Owned(format!(
                        "{} is not a valid epoch",
                        invalid.replace("-", "")
                    ))),
                    None,
                )),
                expect_timestamp_or_null(value_string(0, invalid), Format::EpochSeconds)
            );
        }
        assert_eq!(
            Ok(Some(DateTime::from_secs_f64(2048.0))),
            expect_timestamp_or_null(value_number(0, Number::Float(2048.0)), Format::EpochSeconds)