summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/serialization/qcborvalue.cpp10
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp15
2 files changed, 21 insertions, 4 deletions
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index f5cccf1be1..30bfa367ed 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -810,10 +810,12 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
}
if (dt.isValid()) {
QByteArray text = dt.toString(Qt::ISODateWithMs).toLatin1();
- replaceByteData(text, text.size(), Element::StringIsAscii);
- e.type = QCborValue::String;
- d->elements[0].value = qint64(QCborKnownTags::DateTimeString);
- return QCborValue::DateTime;
+ if (!text.isEmpty()) {
+ replaceByteData(text, text.size(), Element::StringIsAscii);
+ e.type = QCborValue::String;
+ d->elements[0].value = qint64(QCborKnownTags::DateTimeString);
+ return QCborValue::DateTime;
+ }
}
break;
}
diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
index 0b3046fbdc..d035ca4ee5 100644
--- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
+++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
@@ -1970,6 +1970,21 @@ void tst_QCborValue::extendedTypeValidation_data()
<< encode(0xc1, 0xfb, -fplimit)
<< QCborValue(QCborKnownTags::UnixTime_t, -fplimit);
}
+
+ // But in fact, QCborValue stores date/times as their ISO textual
+ // representation, which means it can't represent dates before year 1 or
+ // after year 9999.
+ {
+ QDateTime dt(QDate(-1, 1, 1), QTime(0, 0), Qt::UTC);
+ QTest::newRow("UnixTime_t:negative-year")
+ << encode(0xc1, 0x3b, quint64(-dt.toSecsSinceEpoch()) - 1)
+ << QCborValue(QCborKnownTags::UnixTime_t, dt.toSecsSinceEpoch());
+
+ dt.setDate(QDate(10000, 1, 1));
+ QTest::newRow("UnixTime_t:year10k")
+ << encode(0xc1, 0x1b, quint64(dt.toSecsSinceEpoch()))
+ << QCborValue(QCborKnownTags::UnixTime_t, dt.toSecsSinceEpoch());
+ }
}
void tst_QCborValue::extendedTypeValidation()