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-23 05:31:57 +0000 |
commit | f30141c6c6127866a53616b01f1d8e11c47a80c0 (patch) | |
tree | 929f9f575dfef9428518b8a6bf0a0e09c3635241 /src/corelib/time/qdatetime.cpp | |
parent | 3045196fba44c210121274c6b5c2aa59fc1caf5c (diff) | |
download | qtbase-f30141c6c6127866a53616b01f1d8e11c47a80c0.tar.gz |
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.
Change-Id: I41909defffa5305b02fdfcf6d5808e0d9fd5924f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit c47c98ea2b8ec9e8bda51d86f3168bba28c3291a)
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/corelib/time/qdatetime.cpp')
-rw-r--r-- | src/corelib/time/qdatetime.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 6d259ebd35..7085604197 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -75,6 +75,7 @@ #include "qcalendar.h" #include "qgregoriancalendar_p.h" +#include "private/qnumeric_p.h" QT_BEGIN_NAMESPACE @@ -1429,9 +1430,11 @@ 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); + qint64 r; + if (Q_UNLIKELY(add_overflow(jd, ndays, &r))) + return QDate(); + else + return fromJulianDay(r); } /*! |