summaryrefslogtreecommitdiffstats
path: root/src/corelib/text
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2020-05-13 20:11:35 +0200
committerMarc Mutz <marc.mutz@kdab.com>2020-05-21 15:54:31 +0000
commitb8234e564a68082987f63ba644fe97e7c6b9a07f (patch)
tree549941996263d005e3145de4c8be2a1543d96ff5 /src/corelib/text
parent8e569fe5f6fb43e93aabf5298fcb13add3ff7f08 (diff)
QString: fix an aliasing issue in remove(QString)
Even in Qt 5, remove() can be passed an alias to *this. In Qt 6, with the advent of substring sharing, this will become even more pronounced. Use the same fix as was already used in QString::insert(). Change-Id: I1a0d3d99fd7dff6e727661646d2cbfdc94df2682 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> (cherry picked from commit b655734965155146290f3f3a9205243af11e42fb) Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/corelib/text')
-rw-r--r--src/corelib/text/qstring.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 6075285c71..7534551cd6 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -2898,7 +2898,15 @@ static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs
*/
QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
{
- removeStringImpl(*this, str, cs);
+ const auto s = reinterpret_cast<const ushort *>(str.data());
+ const std::less<const ushort *> less = {};
+ if (!less(s, d->data()) && less(s, d->data() + d->alloc)) {
+ // Part of me - take a copy
+ const QVarLengthArray<ushort> copy(s, s + str.size());
+ removeStringImpl(*this, QStringView{copy.data(), copy.size()}, cs);
+ } else {
+ removeStringImpl(*this, qToStringViewIgnoringNull(str), cs);
+ }
return *this;
}