Index: base/time/time_posix.cc |
diff --git a/base/time/time_posix.cc b/base/time/time_posix.cc |
index ac0e99f7eb61b30de3eb16556f77869a8ee4704b..07f95a369461ead840fc003d7d0a88e06208503c 100644 |
--- a/base/time/time_posix.cc |
+++ b/base/time/time_posix.cc |
@@ -113,6 +113,18 @@ int64_t ClockNow(clockid_t clk_id) { |
#else // _POSIX_MONOTONIC_CLOCK |
#error No usable tick clock function on this platform. |
#endif // _POSIX_MONOTONIC_CLOCK |
+ |
+// Safely multiplies |init_value| by |multiply_value| and adds |add_value| |
+// to that. Returns result or 0 value avoiding overflows. |
+int64_t MultiplyAndAdd(int64_t init_value, |
miu
2016/10/18 19:55:13
This helper hides whether overflow occurs (i.e., i
maksims (do not use this acc)
2016/10/19 16:41:04
Removed
|
+ int64_t multiply_value, |
+ int64_t add_value) { |
+ base::CheckedNumeric<int64_t> result(init_value); |
+ result *= multiply_value; |
+ result += add_value; |
+ return result.ValueOrDefault(0); |
+} |
+ |
#endif // !defined(OS_MACOSX) |
} // namespace |
@@ -242,7 +254,7 @@ bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) { |
timestruct.tm_zone = NULL; // not a POSIX field, so mktime/timegm ignore |
#endif |
- int64_t milliseconds; |
+ int64_t milliseconds = 0; |
miu
2016/10/18 19:55:13
nit: Please move the declaration of |milliseconds|
maksims (do not use this acc)
2016/10/19 16:41:04
Done.
|
SysTime seconds; |
// Certain exploded dates do not really exist due to daylight saving times, |
@@ -312,13 +324,15 @@ bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) { |
milliseconds += (kMillisecondsPerSecond - 1); |
} |
} else { |
- milliseconds = seconds * kMillisecondsPerSecond + exploded.millisecond; |
+ milliseconds = |
miu
2016/10/18 19:55:13
Suggestion (to return false if overflow occurs):
maksims (do not use this acc)
2016/10/19 16:41:04
Done.
|
+ MultiplyAndAdd(seconds, kMillisecondsPerSecond, exploded.millisecond); |
} |
// Adjust from Unix (1970) to Windows (1601) epoch. |
- base::Time converted_time = |
- Time((milliseconds * kMicrosecondsPerMillisecond) + |
- kWindowsEpochDeltaMicroseconds); |
+ int64_t microseconds_win_epoch = |
miu
2016/10/18 19:55:13
Similar suggestion here: Declare |microseconds_win
maksims (do not use this acc)
2016/10/19 16:41:04
Done.
|
+ MultiplyAndAdd(milliseconds, kMicrosecondsPerMillisecond, |
+ kWindowsEpochDeltaMicroseconds); |
+ base::Time converted_time(microseconds_win_epoch); |
// If |exploded.day_of_month| is set to 31 on a 28-30 day month, it will |
// return the first day of the next month. Thus round-trip the time and |