summaryrefslogtreecommitdiffstats
path: root/src/corelib/time
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2021-12-16 14:23:08 +0100
committerMarc Mutz <marc.mutz@qt.io>2021-12-21 20:36:46 +0100
commitc47c98ea2b8ec9e8bda51d86f3168bba28c3291a (patch)
tree9229e90ca4bc1da5c48e2f2bf1712a2fd4540acd /src/corelib/time
parent52da10f64542a6c4fda06be1b88e9111331f6500 (diff)
QDateTime: fix UB (signed overflow) in addDays()
The comment indicated that the author expected any overflow to be caught by a bounds check in the subsequent function, however, signed overflow is UB, so anything can happen. Fix by using our API for safe additions instead. Pick-to: 6.3 6.2 5.15 Change-Id: I41909defffa5305b02fdfcf6d5808e0d9fd5924f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/time')
-rw-r--r--src/corelib/time/qdatetime.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index 9638c5b5e8..9690c8c66b 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -1227,9 +1227,10 @@ QDate QDate::addDays(qint64 ndays) const
if (isNull())
return QDate();
- // Due to limits on minJd() and maxJd() we know that any overflow
- // will be invalid and caught by fromJulianDay().
- return fromJulianDay(jd + ndays);
+ if (qint64 r; Q_UNLIKELY(qAddOverflow(jd, ndays, &r)))
+ return QDate();
+ else
+ return fromJulianDay(r);
}
/*!