From c47c98ea2b8ec9e8bda51d86f3168bba28c3291a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 16 Dec 2021 14:23:08 +0100 Subject: [PATCH] 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 --- src/corelib/time/qdatetime.cpp | 7 ++++--- 1 file 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); } /*!