dev-qt/qtcore: Fix allocated memory of QByteArray

...returned by QIODevice::readLine.

See also: https://bugreports.qt.io/browse/QTBUG-87010
Package-Manager: Portage-3.0.12, Repoman-3.0.2
Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
This commit is contained in:
Andreas Sturmlechner
2021-01-07 17:30:35 +01:00
parent ec2437d995
commit 04865eef22
2 changed files with 160 additions and 0 deletions
@@ -0,0 +1,54 @@
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)
---
src/corelib/io/qiodevice.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index cc1d1102522..0f11c2e805c 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -1480,10 +1480,12 @@ QByteArray QIODevice::readLine(qint64 maxSize)
} else
readBytes = readLine(result.data(), result.size());
- if (readBytes <= 0)
+ if (readBytes <= 0) {
result.clear();
- else
+ } else {
result.resize(readBytes);
+ result.squeeze();
+ }
return result;
}
--
2.16.3
+106
View File
@@ -0,0 +1,106 @@
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
QT5_MODULE="qtbase"
inherit linux-info qt5-build
DESCRIPTION="Cross-platform application development framework"
SLOT=5/$(ver_cut 1-3)
if [[ ${QT5_BUILD_TYPE} == release ]]; then
KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ppc ~ppc64 ~sparc ~x86"
fi
IUSE="icu old-kernel systemd"
DEPEND="
dev-libs/double-conversion:=
dev-libs/glib:2
dev-libs/libpcre2[pcre16,unicode]
sys-libs/zlib:=
icu? ( dev-libs/icu:= )
!icu? ( virtual/libiconv )
systemd? ( sys-apps/systemd:= )
"
RDEPEND="${DEPEND}
!<dev-qt/qtcore-4.8.7-r4:4
dev-qt/qtchooser
"
QT5_TARGET_SUBDIRS=(
src/tools/bootstrap
src/tools/moc
src/tools/rcc
src/corelib
src/tools/qlalr
doc
)
QT5_GENTOO_PRIVATE_CONFIG=(
!:network
!:sql
!:testlib
!:xml
)
PATCHES=(
"${FILESDIR}"/${PN}-5.14.1-cmake-macro-backward-compat.patch # bug 703306
"${FILESDIR}"/${PN}-5.15.1-timezone-{1,2}.patch # bug 737914
"${FILESDIR}"/${P}-fix-UB-in-QDateTime.patch # QTBUG-88656
"${FILESDIR}"/${P}-fix-alloc-mem-of-QByteArray.patch # QTBUG-87010
)
pkg_pretend() {
use kernel_linux || return
get_running_version
if kernel_is -lt 4 11 && ! use old-kernel; then
ewarn "The running kernel is older than 4.11. USE=old-kernel is needed for"
ewarn "dev-qt/qtcore to function on this kernel properly. Bugs #669994, #672856"
fi
}
src_prepare() {
# don't add -O3 to CXXFLAGS, bug 549140
sed -i -e '/CONFIG\s*+=/s/optimize_full//' src/corelib/corelib.pro || die
# fix missing qt_version_tag symbol w/ LTO, bug 674382
sed -i -e 's/^gcc:ltcg/gcc/' src/corelib/global/global.pri || die
qt5-build_src_prepare
}
src_configure() {
local myconf=(
$(qt_use icu)
$(qt_use !icu iconv)
$(qt_use systemd journald)
)
use old-kernel && myconf+=(
-no-feature-renameat2 # needs Linux 3.16, bug 669994
-no-feature-getentropy # needs Linux 3.17, bug 669994
-no-feature-statx # needs Linux 4.11, bug 672856
)
qt5-build_src_configure
}
src_install() {
qt5-build_src_install
local flags=(
DBUS FREETYPE IMAGEFORMAT_JPEG IMAGEFORMAT_PNG
OPENGL OPENSSL SSL WIDGETS
)
for flag in ${flags[@]}; do
cat >> "${D}"/${QT5_HEADERDIR}/QtCore/qconfig.h <<- _EOF_ || die
#if defined(QT_NO_${flag}) && defined(QT_${flag})
# undef QT_NO_${flag}
#elif !defined(QT_NO_${flag}) && !defined(QT_${flag})
# define QT_NO_${flag}
#endif
_EOF_
done
}