summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/text/qbytearray
diff options
context:
space:
mode:
authorMårten Nordheim <marten.nordheim@qt.io>2023-08-14 18:48:31 +0200
committerMårten Nordheim <marten.nordheim@qt.io>2023-08-21 23:27:56 +0200
commit4660a230d527a9cffda41999103aba6ff5c2ecd5 (patch)
tree4d9b9381ad8882ee11cb92ee9fdf40a2e5b6917c /tests/auto/corelib/text/qbytearray
parenta6d40467de7b9b07ff0252b6f91f75899aa3d5e1 (diff)
QString/QByteArray: fix append() wrt. raw data
When appending to an empty string or byte array, we optimize and copy the internal pointer. But if the other string/byte array was created with fromRawData this might be temporary data on the stack/heap and might be de-allocated or overwritten before the string/byte array is used or is forced to make a deep-copy. This would lead to incorrect data being used. This is easy to overlook if you plan to append multiple strings together, potentially supplied through an argument. Upon appending a second string it would make a full copy, but there might not be a guarantee for that. So, it's hard for users to avoid this pitfall! Fixes: QTBUG-115752 Pick-to: 6.6 6.5 6.2 Change-Id: Ia9aa5f463121c2ce2e0e8eee8a6c8612b7297f2b Reviewed-by: Ahmad Samir <a.samirh78@gmail.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/text/qbytearray')
-rw-r--r--tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
index f5e149836a..ec418edcdc 100644
--- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
@@ -51,6 +51,7 @@ private slots:
void prependExtended_data();
void prependExtended();
void append();
+ void appendFromRawData();
void appendExtended_data();
void appendExtended();
void appendEmptyNull();
@@ -914,6 +915,20 @@ void tst_QByteArray::append()
}
}
+void tst_QByteArray::appendFromRawData()
+{
+ char rawData[] = "Hello World!";
+ QByteArray ba = QByteArray::fromRawData(rawData, std::size(rawData) - 1);
+
+ QByteArray copy;
+ copy.append(ba);
+ QCOMPARE(copy, ba);
+ // We make an _actual_ copy, because appending a byte array
+ // created with fromRawData() might be optimized to copy the DataPointer,
+ // which means we may point to temporary stack data.
+ QCOMPARE_NE((void *)copy.constData(), (void *)ba.constData());
+}
+
void tst_QByteArray::appendExtended_data()
{
prependExtended_data();