| Index: base/time.cc
|
| diff --git a/base/time.cc b/base/time.cc
|
| index 7055311e80e7d53df843b61dd63a67b816a74faa..f2f3168e9f5112160d54b69ffa60ed14ee33cdff 100644
|
| --- a/base/time.cc
|
| +++ b/base/time.cc
|
| @@ -74,12 +74,23 @@ Time Time::Max() {
|
| Time Time::FromTimeT(time_t tt) {
|
| if (tt == 0)
|
| return Time(); // Preserve 0 so we can tell it doesn't exist.
|
| + if (tt == std::numeric_limits<time_t>::max())
|
| + return Max();
|
| return Time((tt * kMicrosecondsPerSecond) + kTimeTToMicrosecondsOffset);
|
| }
|
|
|
| time_t Time::ToTimeT() const {
|
| - if (us_ == 0)
|
| + if (is_null())
|
| return 0; // Preserve 0 so we can tell it doesn't exist.
|
| + if (is_max()) {
|
| + // Preserve max without offset to prevent overflow.
|
| + return std::numeric_limits<time_t>::max();
|
| + }
|
| + if (std::numeric_limits<int64>::max() - kTimeTToMicrosecondsOffset <= us_) {
|
| + DLOG(WARNING) << "Overflow when converting base::Time with internal " <<
|
| + "value " << us_ << " to time_t.";
|
| + return std::numeric_limits<time_t>::max();
|
| + }
|
| return (us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerSecond;
|
| }
|
|
|
| @@ -87,14 +98,20 @@ time_t Time::ToTimeT() const {
|
| Time Time::FromDoubleT(double dt) {
|
| if (dt == 0 || isnan(dt))
|
| return Time(); // Preserve 0 so we can tell it doesn't exist.
|
| + if (dt == std::numeric_limits<double>::max())
|
| + return Max();
|
| return Time(static_cast<int64>((dt *
|
| static_cast<double>(kMicrosecondsPerSecond)) +
|
| kTimeTToMicrosecondsOffset));
|
| }
|
|
|
| double Time::ToDoubleT() const {
|
| - if (us_ == 0)
|
| + if (is_null())
|
| return 0; // Preserve 0 so we can tell it doesn't exist.
|
| + if (is_max()) {
|
| + // Preserve max without offset to prevent overflow.
|
| + return std::numeric_limits<double>::max();
|
| + }
|
| return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
|
| static_cast<double>(kMicrosecondsPerSecond));
|
| }
|
| @@ -103,15 +120,21 @@ double Time::ToDoubleT() const {
|
| Time Time::FromJsTime(double ms_since_epoch) {
|
| // The epoch is a valid time, so this constructor doesn't interpret
|
| // 0 as the null time.
|
| + if (ms_since_epoch == std::numeric_limits<double>::max())
|
| + return Max();
|
| return Time(static_cast<int64>(ms_since_epoch * kMicrosecondsPerMillisecond) +
|
| kTimeTToMicrosecondsOffset);
|
| }
|
|
|
| double Time::ToJsTime() const {
|
| - if (us_ == 0) {
|
| + if (is_null()) {
|
| // Preserve 0 so the invalid result doesn't depend on the platform.
|
| return 0;
|
| }
|
| + if (is_max()) {
|
| + // Preserve max without offset to prevent overflow.
|
| + return std::numeric_limits<double>::max();
|
| + }
|
| return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
|
| kMicrosecondsPerMillisecond);
|
| }
|
|
|