aboutsummaryrefslogtreecommitdiff
path: root/src/de
diff options
context:
space:
mode:
authorJoel Galenson <jgalenson@google.com>2021-04-13 22:18:59 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-04-13 22:18:59 +0000
commit64651b78902cbcdf404dce0c5dd44239f36e9125 (patch)
treec5ffb7b06eff412106240d3af108bf86da4b39df /src/de
parent69176c5aeb6a3c9eaf55c191a722836d852059e2 (diff)
parentb47b8285ecfafe71051c49975fbd73dcf9b6694f (diff)
downloadserde-64651b78902cbcdf404dce0c5dd44239f36e9125.tar.gz
Upgrade rust/crates/serde to 1.0.125 am: b32e27274d am: b47b8285ec
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/serde/+/1662806 Change-Id: I4adf070ebf81a40de150342bbba5d5f06f594554
Diffstat (limited to 'src/de')
-rw-r--r--src/de/impls.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/de/impls.rs b/src/de/impls.rs
index 409f6cb..59d90d2 100644
--- a/src/de/impls.rs
+++ b/src/de/impls.rs
@@ -2046,6 +2046,17 @@ impl<'de> Deserialize<'de> for SystemTime {
}
}
+ fn check_overflow<E>(secs: u64, nanos: u32) -> Result<(), E>
+ where
+ E: Error,
+ {
+ static NANOS_PER_SEC: u32 = 1_000_000_000;
+ match secs.checked_add((nanos / NANOS_PER_SEC) as u64) {
+ Some(_) => Ok(()),
+ None => Err(E::custom("overflow deserializing SystemTime epoch offset")),
+ }
+ }
+
struct DurationVisitor;
impl<'de> Visitor<'de> for DurationVisitor {
@@ -2071,6 +2082,7 @@ impl<'de> Deserialize<'de> for SystemTime {
return Err(Error::invalid_length(1, &self));
}
};
+ try!(check_overflow(secs, nanos));
Ok(Duration::new(secs, nanos))
}
@@ -2108,13 +2120,20 @@ impl<'de> Deserialize<'de> for SystemTime {
Some(nanos) => nanos,
None => return Err(<A::Error as Error>::missing_field("nanos_since_epoch")),
};
+ try!(check_overflow(secs, nanos));
Ok(Duration::new(secs, nanos))
}
}
const FIELDS: &'static [&'static str] = &["secs_since_epoch", "nanos_since_epoch"];
let duration = try!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor));
- Ok(UNIX_EPOCH + duration)
+ #[cfg(systemtime_checked_add)]
+ let ret = UNIX_EPOCH
+ .checked_add(duration)
+ .ok_or_else(|| D::Error::custom("overflow deserializing SystemTime"));
+ #[cfg(not(systemtime_checked_add))]
+ let ret = Ok(UNIX_EPOCH + duration);
+ ret
}
}