summaryrefslogtreecommitdiff
path: root/src/corelib/time/qdatetime.cpp
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-23 05:31:57 +0000
commitf30141c6c6127866a53616b01f1d8e11c47a80c0 (patch)
tree929f9f575dfef9428518b8a6bf0a0e09c3635241 /src/corelib/time/qdatetime.cpp
parent3045196fba44c210121274c6b5c2aa59fc1caf5c (diff)
downloadqtbase-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.cpp9
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);
}
/*!