| 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); | 
| } | 
|  |