mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-11-08 18:27:07 -08:00
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:
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user