From a15639a3ab534fe335c9f9e7569351b8ec0cd37c Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Wed, 7 May 2025 11:19:19 +0300 Subject: [PATCH] QByteArray: make replace(pos, len, view) consistent with QString's Return early if `pos` is out-of-bounds. Amends 57d91d8029064b592dee8adf819bde676763df28 (also part of this commit message was borrowed from it). [ChangeLog][QtCore][Important Behavior Changes][QByteArray] replace() is now consistent with QString::replace() in its treatment of out-of-bounds indexes. Change-Id: Iae8cf795364654fd6438b2a4ed3162925a73cb9e Reviewed-by: Ivan Solovev Reviewed-by: Thiago Macieira --- src/corelib/text/qbytearray.cpp | 8 +++++++- tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 901a7550e9f..b50d5901e0c 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -2477,11 +2477,17 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len) QByteArray &QByteArray::replace(qsizetype pos, qsizetype len, QByteArrayView after) { + if (size_t(pos) > size_t(this->size())) + return *this; + if (len > this->size() - pos) + len = this->size() - pos; + if (QtPrivate::q_points_into_range(after.data(), d)) { QVarLengthArray copy(after.data(), after.data() + after.size()); return replace(pos, len, QByteArrayView{copy}); } - if (len == after.size() && (pos + len <= size())) { + + if (len == after.size()) { // same size: in-place replacement possible if (len > 0) { detach(); diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index bd8a0dc2248..5335d6c50c1 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -1481,7 +1481,7 @@ void tst_QByteArray::replace_data() QTest::newRow("4") << QByteArray() << 0 << 0 << QByteArray() << QByteArray() << QByteArray(); // index out of range QTest::newRow("5") << QByteArray() << 3 << 0 << QByteArray() << QByteArray("hi") - << QByteArray(" hi"); + << QByteArray(); // Optimized path QTest::newRow("6") << QByteArray("abcdef") << 3 << 12 << QByteArray() << QByteArray("abcdefghijkl") << QByteArray("abcabcdefghijkl");