summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/Timer.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2011-04-06 09:40:55 +0200
committerBenoit Foucher <benoit@zeroc.com>2011-04-06 09:40:55 +0200
commit8e4d4c244e2560ed0d9957a36f8eade79e455c0d (patch)
treee0509c2864d2152831f6309d70afa8426fb3f6a3 /cpp/src/IceUtil/Timer.cpp
parentFix for bug 4799: minimize escapes in config files generated by IceGrid (diff)
downloadice-8e4d4c244e2560ed0d9957a36f8eade79e455c0d.tar.bz2
ice-8e4d4c244e2560ed0d9957a36f8eade79e455c0d.tar.xz
ice-8e4d4c244e2560ed0d9957a36f8eade79e455c0d.zip
Fixed bug 3683 - Added check for overflows when delay is too large
Diffstat (limited to 'cpp/src/IceUtil/Timer.cpp')
-rw-r--r--cpp/src/IceUtil/Timer.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp
index 1645b86df9f..31a6884b75a 100644
--- a/cpp/src/IceUtil/Timer.cpp
+++ b/cpp/src/IceUtil/Timer.cpp
@@ -65,7 +65,13 @@ Timer::schedule(const TimerTaskPtr& task, const IceUtil::Time& delay)
throw IllegalArgumentException(__FILE__, __LINE__, "timer destroyed");
}
- IceUtil::Time time = IceUtil::Time::now(IceUtil::Time::Monotonic) + delay;
+ IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic);
+ IceUtil::Time time = now + delay;
+ if(delay > IceUtil::Time() && time < now)
+ {
+ throw IllegalArgumentException(__FILE__, __LINE__, "invalid delay");
+ }
+
bool inserted = _tasks.insert(make_pair(task, time)).second;
if(!inserted)
{
@@ -88,7 +94,13 @@ Timer::scheduleRepeated(const TimerTaskPtr& task, const IceUtil::Time& delay)
throw IllegalArgumentException(__FILE__, __LINE__, "timer destroyed");
}
- const Token token(IceUtil::Time::now(IceUtil::Time::Monotonic) + delay, delay, task);
+ IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic);
+ const Token token(now + delay, delay, task);
+ if(delay > IceUtil::Time() && token.scheduledTime < now)
+ {
+ throw IllegalArgumentException(__FILE__, __LINE__, "invalid delay");
+ }
+
bool inserted = _tasks.insert(make_pair(task, token.scheduledTime)).second;
if(!inserted)
{