forked from pool/libqt5-qtbase
Fabian Vogt
3147699433
- Add patch to avoid excessive use of memory by lconvert: * 0001-Fix-allocated-memory-of-QByteArray.patch OBS-URL: https://build.opensuse.org/request/show/859199 OBS-URL: https://build.opensuse.org/package/show/KDE:Qt:5.15/libqt5-qtbase?expand=0&rev=20
50 lines
1.7 KiB
Diff
50 lines
1.7 KiB
Diff
From 6485b6d45ad165cf976138cf8ab683c42515e794 Mon Sep 17 00:00:00 2001
|
|
From: Kai Koehne <kai.koehne@qt.io>
|
|
Date: Tue, 13 Oct 2020 15:47:31 +0200
|
|
Subject: [PATCH] Fix allocated memory of QByteArray returned by QIODevice::readLine
|
|
|
|
If the maxSize argument is 0 (the default), QIODevice::readLine will
|
|
allocate a QByteArray with the size of the next chunk of data, which
|
|
may be quite large. Before returning, it then resizes the byte array
|
|
to the actual size that was read.
|
|
|
|
But since change 6b884d2aa129, QByteArray::resize() does no
|
|
longer shrink the capacity. This means that the returned QByteArray
|
|
keeps it's maximum size as allocated memory. This can lead to
|
|
excessive memory consumption, especially if the returned QByteArray's
|
|
are stored for further processing in the client code.
|
|
|
|
Fix this by explicitly calling QByteArray::squeeze() before returning.
|
|
|
|
[ChangeLog][QtCore][QIODevice] Fixes a regression in Qt 5.15 causing
|
|
QByteArray's that are returned by QIODevice::readLine() to
|
|
consume large amounts of memory.
|
|
|
|
Fixes: QTBUG-87010
|
|
Change-Id: I1f95fc4098849e900680fc945238bfeda881022c
|
|
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
|
|
(cherry picked from commit 263b29eedb223dec1ecaee193302070af87a1852,
|
|
limited squeeze() call if bytes are actually read to preserve retVal.isNull()
|
|
behavior in 5.15)
|
|
---
|
|
|
|
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
|
|
index cc1d110..0f11c2e 100644
|
|
--- a/src/corelib/io/qiodevice.cpp
|
|
+++ b/src/corelib/io/qiodevice.cpp
|
|
@@ -1480,10 +1480,12 @@
|
|
} else
|
|
readBytes = readLine(result.data(), result.size());
|
|
|
|
- if (readBytes <= 0)
|
|
+ if (readBytes <= 0) {
|
|
result.clear();
|
|
- else
|
|
+ } else {
|
|
result.resize(readBytes);
|
|
+ result.squeeze();
|
|
+ }
|
|
|
|
return result;
|
|
}
|