diff options
author | Marc Mutz <marc.mutz@qt.io> | 2021-12-16 14:23:08 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2021-12-21 20:36:46 +0100 |
commit | c47c98ea2b8ec9e8bda51d86f3168bba28c3291a (patch) | |
tree | 9229e90ca4bc1da5c48e2f2bf1712a2fd4540acd /src/corelib/time | |
parent | 52da10f64542a6c4fda06be1b88e9111331f6500 (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.cpp | 7 |
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); } /*! |