Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: base/time/time_win.cc

Issue 2405453002: Fix Integer-overflow in base::Time::FromExploded. (Closed)
Patch Set: move method under ifdef Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« base/time/time_posix.cc ('K') | « base/time/time_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 // Windows Timer Primer 6 // Windows Timer Primer
7 // 7 //
8 // A good article: http://www.ddj.com/windows/184416651 8 // A good article: http://www.ddj.com/windows/184416651
9 // A good mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=363258 9 // A good mozilla bug: http://bugzilla.mozilla.org/show_bug.cgi?id=363258
10 // 10 //
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 // Returns the current value of the performance counter. 102 // Returns the current value of the performance counter.
103 uint64_t QPCNowRaw() { 103 uint64_t QPCNowRaw() {
104 LARGE_INTEGER perf_counter_now = {}; 104 LARGE_INTEGER perf_counter_now = {};
105 // According to the MSDN documentation for QueryPerformanceCounter(), this 105 // According to the MSDN documentation for QueryPerformanceCounter(), this
106 // will never fail on systems that run XP or later. 106 // will never fail on systems that run XP or later.
107 // https://msdn.microsoft.com/library/windows/desktop/ms644904.aspx 107 // https://msdn.microsoft.com/library/windows/desktop/ms644904.aspx
108 ::QueryPerformanceCounter(&perf_counter_now); 108 ::QueryPerformanceCounter(&perf_counter_now);
109 return perf_counter_now.QuadPart; 109 return perf_counter_now.QuadPart;
110 } 110 }
111 111
112 // Maximum size of the
113 const int kMaxWinWordSize = 65535;
mmenke 2016/10/18 15:04:50 This should just be std::numeric_limits<WORD>::max
114
112 } // namespace 115 } // namespace
113 116
114 // Time ----------------------------------------------------------------------- 117 // Time -----------------------------------------------------------------------
115 118
116 // The internal representation of Time uses FILETIME, whose epoch is 1601-01-01 119 // The internal representation of Time uses FILETIME, whose epoch is 1601-01-01
117 // 00:00:00 UTC. ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the 120 // 00:00:00 UTC. ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the
118 // number of leap year days between 1601 and 1970: (1970-1601)/4 excluding 121 // number of leap year days between 1601 and 1970: (1970-1601)/4 excluding
119 // 1700, 1800, and 1900. 122 // 1700, 1800, and 1900.
120 // static 123 // static
121 const int64_t Time::kTimeTToMicrosecondsOffset = INT64_C(11644473600000000); 124 const int64_t Time::kTimeTToMicrosecondsOffset = INT64_C(11644473600000000);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 } 232 }
230 233
231 // static 234 // static
232 bool Time::IsHighResolutionTimerInUse() { 235 bool Time::IsHighResolutionTimerInUse() {
233 base::AutoLock lock(g_high_res_lock.Get()); 236 base::AutoLock lock(g_high_res_lock.Get());
234 return g_high_res_timer_enabled && g_high_res_timer_count > 0; 237 return g_high_res_timer_enabled && g_high_res_timer_count > 0;
235 } 238 }
236 239
237 // static 240 // static
238 bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) { 241 bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) {
242 // Windows WORD has size of 2 bytes. Thus, maximum value that can be
243 // stored is 65535. If it is not possible to cast to WORD without an overflow,
244 // just return an error.
245 if (exploded.year > kMaxWinWordSize) {
miu 2016/10/18 19:55:13 Suggestion: if (exploded.year > std::numeric_li
maksims (do not use this acc) 2016/10/19 16:41:04 Yes. Removed
246 *time = Time(0);
247 return false;
248 }
249
239 // Create the system struct representing our exploded time. It will either be 250 // Create the system struct representing our exploded time. It will either be
240 // in local time or UTC. 251 // in local time or UTC.
241 SYSTEMTIME st; 252 SYSTEMTIME st;
242 st.wYear = static_cast<WORD>(exploded.year); 253 st.wYear = static_cast<WORD>(exploded.year);
243 st.wMonth = static_cast<WORD>(exploded.month); 254 st.wMonth = static_cast<WORD>(exploded.month);
244 st.wDayOfWeek = static_cast<WORD>(exploded.day_of_week); 255 st.wDayOfWeek = static_cast<WORD>(exploded.day_of_week);
245 st.wDay = static_cast<WORD>(exploded.day_of_month); 256 st.wDay = static_cast<WORD>(exploded.day_of_month);
246 st.wHour = static_cast<WORD>(exploded.hour); 257 st.wHour = static_cast<WORD>(exploded.hour);
247 st.wMinute = static_cast<WORD>(exploded.minute); 258 st.wMinute = static_cast<WORD>(exploded.minute);
248 st.wSecond = static_cast<WORD>(exploded.second); 259 st.wSecond = static_cast<WORD>(exploded.second);
249 st.wMilliseconds = static_cast<WORD>(exploded.millisecond); 260 st.wMilliseconds = static_cast<WORD>(exploded.millisecond);
mmenke 2016/10/18 15:04:50 Seems like this should be: if (!SafeConvertToWord
maksims (do not use this acc) 2016/10/19 16:41:04 Done.
250 261
251 FILETIME ft; 262 FILETIME ft;
252 bool success = true; 263 bool success = true;
253 // Ensure that it's in UTC. 264 // Ensure that it's in UTC.
254 if (is_local) { 265 if (is_local) {
255 SYSTEMTIME utc_st; 266 SYSTEMTIME utc_st;
256 success = TzSpecificLocalTimeToSystemTime(nullptr, &st, &utc_st) && 267 success = TzSpecificLocalTimeToSystemTime(nullptr, &st, &utc_st) &&
257 SystemTimeToFileTime(&utc_st, &ft); 268 SystemTimeToFileTime(&utc_st, &ft);
258 } else { 269 } else {
259 success = !!SystemTimeToFileTime(&st, &ft); 270 success = !!SystemTimeToFileTime(&st, &ft);
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 TimeTicks TimeTicks::FromQPCValue(LONGLONG qpc_value) { 641 TimeTicks TimeTicks::FromQPCValue(LONGLONG qpc_value) {
631 return TimeTicks() + QPCValueToTimeDelta(qpc_value); 642 return TimeTicks() + QPCValueToTimeDelta(qpc_value);
632 } 643 }
633 644
634 // TimeDelta ------------------------------------------------------------------ 645 // TimeDelta ------------------------------------------------------------------
635 646
636 // static 647 // static
637 TimeDelta TimeDelta::FromQPCValue(LONGLONG qpc_value) { 648 TimeDelta TimeDelta::FromQPCValue(LONGLONG qpc_value) {
638 return QPCValueToTimeDelta(qpc_value); 649 return QPCValueToTimeDelta(qpc_value);
639 } 650 }
OLDNEW
« base/time/time_posix.cc ('K') | « base/time/time_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698