summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2021-12-16 09:04:01 +0100
committerMarc Mutz <marc.mutz@qt.io>2021-12-21 20:36:34 +0100
commit52da10f64542a6c4fda06be1b88e9111331f6500 (patch)
treee7f991dd4739dc51d07839bddb220e817bda92fc /src
parentb330016cf25ed4eae95958213b746d718ac644d2 (diff)
QVariantAnimation: fix UB (FP 0/0) in interpolated() arg calculation
When startProgress, endProgress, and progress were all 0 (as provoked by tst_QPropertyAnimation::startWithoutStartValue()), we'd calculate 0/0 and ubsan complained: qvariantanimation.cpp:284:60: runtime error: division by zero Fix by detecting progress - startProgress == 0 and setting localProgress = 0.0 in that case. This is a logical result, even though it might not be what IEEE754 rules would have yielded. A more comprehensive change that aims to reliably keep localProgress ∈ [0,1] and thus avoid the infinities when endProgress == startProgress, is outside the scope of this patch, which deals only with the UBSan error. Pick-to: 6.3 6.2 5.15 Change-Id: I5258b054a2060006795f49fb1cd7604aea3ed46b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/animation/qvariantanimation.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index a0f0e176b6..026db981ea 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -278,7 +278,9 @@ void QVariantAnimationPrivate::setCurrentValueForProgress(const qreal progress)
const qreal startProgress = currentInterval.start.first;
const qreal endProgress = currentInterval.end.first;
- const qreal localProgress = (progress - startProgress) / (endProgress - startProgress);
+ const qreal localProgress =
+ qIsNull(progress - startProgress) ? 0.0 // avoid 0/0 below
+ /* else */ : (progress - startProgress) / (endProgress - startProgress);
QVariant ret = q->interpolated(currentInterval.start.second,
currentInterval.end.second,