aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquicktimeline.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@digia.com>2014-02-20 18:03:10 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-21 18:55:31 +0100
commitdb32813a865fe8eda6a4ff87c71b791a26b343c3 (patch)
tree798efea85d2ab01680bb650161ac683679cee440 /src/quick/util/qquicktimeline.cpp
parent325161d1c4f4b9c41e620dc842f2ce503404e245 (diff)
QQuickTimeLine: add missing time checks
The same check is done in QQuickTimeLine::pause(), move() and moveBy(), where the time is passed as an argument. QQuickTimeLine::accel() and accelDistance() calculate the time based on velocity and acceleration or distance. With tiny values this calculation can result to a negative time due to integer overflow. Task-number: QTBUG-35046 Change-Id: I000e73d3f787375946e8f87a5d24153ae919bc8d Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'src/quick/util/qquicktimeline.cpp')
-rw-r--r--src/quick/util/qquicktimeline.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/quick/util/qquicktimeline.cpp b/src/quick/util/qquicktimeline.cpp
index 5305537d24..94e1f30215 100644
--- a/src/quick/util/qquicktimeline.cpp
+++ b/src/quick/util/qquicktimeline.cpp
@@ -396,6 +396,7 @@ int QQuickTimeLine::accel(QQuickTimeLineValue &timeLineValue, qreal velocity, qr
acceleration = acceleration * -1.0f;
int time = static_cast<int>(-1000 * velocity / acceleration);
+ if (time <= 0) return -1;
QQuickTimeLinePrivate::Op op(QQuickTimeLinePrivate::Op::Accel, time, velocity, acceleration, d->order++);
d->add(timeLineValue, op);
@@ -428,6 +429,7 @@ int QQuickTimeLine::accel(QQuickTimeLineValue &timeLineValue, qreal velocity, qr
acceleration = acceleration * -1.0f;
int time = static_cast<int>(-1000 * velocity / acceleration);
+ if (time <= 0) return -1;
QQuickTimeLinePrivate::Op op(QQuickTimeLinePrivate::Op::Accel, time, velocity, acceleration, d->order++);
d->add(timeLineValue, op);
@@ -450,6 +452,7 @@ int QQuickTimeLine::accelDistance(QQuickTimeLineValue &timeLineValue, qreal velo
Q_ASSERT((distance >= 0.0f) == (velocity >= 0.0f));
int time = static_cast<int>(1000 * (2.0f * distance) / velocity);
+ if (time <= 0) return -1;
QQuickTimeLinePrivate::Op op(QQuickTimeLinePrivate::Op::AccelDistance, time, velocity, distance, d->order++);
d->add(timeLineValue, op);