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

Side by Side Diff: base/time/time_mac.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
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 #include "base/time/time.h" 5 #include "base/time/time.h"
6 6
7 #include <CoreFoundation/CFDate.h> 7 #include <CoreFoundation/CFDate.h>
8 #include <CoreFoundation/CFTimeZone.h> 8 #include <CoreFoundation/CFTimeZone.h>
9 #include <mach/mach.h> 9 #include <mach/mach.h>
10 #include <mach/mach_time.h> 10 #include <mach/mach_time.h>
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 CFCalendarSetTimeZone(gregorian, time_zone); 183 CFCalendarSetTimeZone(gregorian, time_zone);
184 CFAbsoluteTime absolute_time; 184 CFAbsoluteTime absolute_time;
185 // 'S' is not defined in componentDesc in Apple documentation, but can be 185 // 'S' is not defined in componentDesc in Apple documentation, but can be
186 // found at http://www.opensource.apple.com/source/CF/CF-855.17/CFCalendar.c 186 // found at http://www.opensource.apple.com/source/CF/CF-855.17/CFCalendar.c
187 CFCalendarComposeAbsoluteTime( 187 CFCalendarComposeAbsoluteTime(
188 gregorian, &absolute_time, "yMdHmsS", exploded.year, exploded.month, 188 gregorian, &absolute_time, "yMdHmsS", exploded.year, exploded.month,
189 exploded.day_of_month, exploded.hour, exploded.minute, exploded.second, 189 exploded.day_of_month, exploded.hour, exploded.minute, exploded.second,
190 exploded.millisecond); 190 exploded.millisecond);
191 CFAbsoluteTime seconds = absolute_time + kCFAbsoluteTimeIntervalSince1970; 191 CFAbsoluteTime seconds = absolute_time + kCFAbsoluteTimeIntervalSince1970;
192 192
193 base::Time converted_time = 193 // CFAbsolutTime is typedef of double. Convert seconds to
194 Time(static_cast<int64_t>(seconds * kMicrosecondsPerSecond) + 194 // microseconds using this type and then cast to int64_t. If
195 kWindowsEpochDeltaMicroseconds); 195 // it cannot be suited to int64, then fail to avoid overflows.
196 CFAbsoluteTime microseconds =
miu 2016/10/18 19:55:13 Even though we know CFAbsoluteTime is a double, it
maksims (do not use this acc) 2016/10/19 16:41:04 Done.
197 (seconds * kMicrosecondsPerSecond) + kWindowsEpochDeltaMicroseconds;
198 if (microseconds > std::numeric_limits<int64_t>::max() ||
199 microseconds < std::numeric_limits<int64_t>::min()) {
200 *time = Time(0);
201 return false;
202 }
203
204 base::Time converted_time = Time(static_cast<int64_t>(microseconds));
196 205
197 // If |exploded.day_of_month| is set to 31 206 // If |exploded.day_of_month| is set to 31
198 // on a 28-30 day month, it will return the first day of the next month. 207 // on a 28-30 day month, it will return the first day of the next month.
199 // Thus round-trip the time and compare the initial |exploded| with 208 // Thus round-trip the time and compare the initial |exploded| with
200 // |utc_to_exploded| time. 209 // |utc_to_exploded| time.
201 base::Time::Exploded to_exploded; 210 base::Time::Exploded to_exploded;
202 if (!is_local) 211 if (!is_local)
203 converted_time.UTCExplode(&to_exploded); 212 converted_time.UTCExplode(&to_exploded);
204 else 213 else
205 converted_time.LocalExplode(&to_exploded); 214 converted_time.LocalExplode(&to_exploded);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 return Clock::MAC_MACH_ABSOLUTE_TIME; 292 return Clock::MAC_MACH_ABSOLUTE_TIME;
284 #endif // defined(OS_IOS) 293 #endif // defined(OS_IOS)
285 } 294 }
286 295
287 // static 296 // static
288 ThreadTicks ThreadTicks::Now() { 297 ThreadTicks ThreadTicks::Now() {
289 return ThreadTicks(ComputeThreadTicks()); 298 return ThreadTicks(ComputeThreadTicks());
290 } 299 }
291 300
292 } // namespace base 301 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698