diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h
index f3cbba26dd..2fbbb43b32 100644
--- a/src/corelib/text/qstringbuilder.h
+++ b/src/corelib/text/qstringbuilder.h
@@ -449,7 +449,9 @@ QByteArray &appendToByteArray(QByteArray &a, const QStringBuilder &b, char
{
// append 8-bit data to a byte array
qsizetype len = a.size() + QConcatenable< QStringBuilder >::size(b);
- a.reserve(len);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.capacity())
+ a.reserve(qMax(len, 2 * a.capacity()));
char *it = a.data() + a.size();
QConcatenable< QStringBuilder >::appendTo(b, it);
a.resize(len); //we need to resize after the appendTo for the case str+=foo+str
@@ -476,9 +478,12 @@ template
QString &operator+=(QString &a, const QStringBuilder &b)
{
qsizetype len = a.size() + QConcatenable< QStringBuilder >::size(b);
- a.reserve(len);
+ a.detach(); // a detach() in a.data() could reset a.capacity() to a.size()
+ if (len > a.capacity())
+ a.reserve(qMax(len, 2 * a.capacity()));
QChar *it = a.data() + a.size();
QConcatenable< QStringBuilder >::appendTo(b, it);
+ // we need to resize after the appendTo for the case str+=foo+str
a.resize(it - a.constData()); //may be smaller than len if there was conversion from utf8
return a;
}