Index: base/message_loop/message_pump_win.cc |
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc |
index a219aa6b79255de7fb6e3027b0512407b730a8ff..75702abec19249b7476d8659724f36bb591c592b 100644 |
--- a/base/message_loop/message_pump_win.cc |
+++ b/base/message_loop/message_pump_win.cc |
@@ -4,6 +4,7 @@ |
#include "base/message_loop/message_pump_win.h" |
+#include <limits> |
#include <math.h> |
#include "base/debug/trace_event.h" |
@@ -70,12 +71,13 @@ int MessagePumpWin::GetCurrentDelay() const { |
double timeout = |
ceil((delayed_work_time_ - TimeTicks::Now()).InMillisecondsF()); |
- // If this value is negative, then we need to run delayed work soon. |
- int delay = static_cast<int>(timeout); |
- if (delay < 0) |
- delay = 0; |
- |
- return delay; |
+ // Range check the |timeout| while converting to an integer. If the |timeout| |
+ // is negative, then we need to run delayed work soon. If the |timeout| is |
+ // "overflowingly" large, that means a delayed task was posted with a |
+ // super-long delay. |
+ return timeout < 0 ? 0 : |
+ (timeout > std::numeric_limits<int>::max() ? |
+ std::numeric_limits<int>::max() : static_cast<int>(timeout)); |
} |
//----------------------------------------------------------------------------- |