summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/time/qdatetime.cpp10
-rw-r--r--src/corelib/time/qtimezoneprivate.cpp6
2 files changed, 12 insertions, 4 deletions
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index c3e9b49b25e..504ededb56f 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -2824,11 +2824,13 @@ QDateTimePrivate::ZoneState QDateTimePrivate::expressUtcAsLocal(qint64 utcMSecs)
#if QT_CONFIG(timezone) // Use the system time-zone.
if (const auto sys = QTimeZone::systemTimeZone(); sys.isValid()) {
result.offset = sys.d->offsetFromUtc(utcMSecs);
- if (qAddOverflow(utcMSecs, result.offset * MSECS_PER_SEC, &result.when))
+ if (result.offset != QTimeZonePrivate::invalidSeconds()) {
+ if (qAddOverflow(utcMSecs, result.offset * MSECS_PER_SEC, &result.when))
+ return result;
+ result.dst = sys.d->isDaylightTime(utcMSecs) ? DaylightTime : StandardTime;
+ result.valid = true;
return result;
- result.dst = sys.d->isDaylightTime(utcMSecs) ? DaylightTime : StandardTime;
- result.valid = true;
- return result;
+ }
}
#endif // timezone
diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp
index d06c1aa6625..17b32ec2e8e 100644
--- a/src/corelib/time/qtimezoneprivate.cpp
+++ b/src/corelib/time/qtimezoneprivate.cpp
@@ -341,6 +341,12 @@ QDateTimePrivate::ZoneState QTimeZonePrivate::stateAtZoneTime(
Q_ASSERT(recent < imminent && seventeenHoursInMSecs < imminent - recent + 1);
const Data past = data(recent), future = data(imminent);
+ if (future.atMSecsSinceEpoch == invalidMSecs()
+ && past.atMSecsSinceEpoch == invalidMSecs()) {
+ // Failed to get any useful data near this time: apparently out of range
+ // for the backend.
+ return { forLocalMSecs };
+ }
// > 99% of the time, past and future will agree:
if (Q_LIKELY(past.offsetFromUtc == future.offsetFromUtc
&& past.standardTimeOffset == future.standardTimeOffset