commit:     04865eef221ea16b0ec3c2b92f0a549bc56a8dce
Author:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
AuthorDate: Thu Jan  7 15:54:57 2021 +0000
Commit:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
CommitDate: Thu Jan  7 16:30:35 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=04865eef

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 <AT> gentoo.org>

 ...qtcore-5.15.2-fix-alloc-mem-of-QByteArray.patch |  54 +++++++++++
 dev-qt/qtcore/qtcore-5.15.2-r2.ebuild              | 106 +++++++++++++++++++++
 2 files changed, 160 insertions(+)

diff --git 
a/dev-qt/qtcore/files/qtcore-5.15.2-fix-alloc-mem-of-QByteArray.patch 
b/dev-qt/qtcore/files/qtcore-5.15.2-fix-alloc-mem-of-QByteArray.patch
new file mode 100644
index 00000000000..892d89d2948
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.15.2-fix-alloc-mem-of-QByteArray.patch
@@ -0,0 +1,54 @@
+From 6485b6d45ad165cf976138cf8ab683c42515e794 Mon Sep 17 00:00:00 2001
+From: Kai Koehne <[email protected]>
+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 <[email protected]>
+(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

diff --git a/dev-qt/qtcore/qtcore-5.15.2-r2.ebuild 
b/dev-qt/qtcore/qtcore-5.15.2-r2.ebuild
new file mode 100644
index 00000000000..3fce1aceac5
--- /dev/null
+++ b/dev-qt/qtcore/qtcore-5.15.2-r2.ebuild
@@ -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
+}

Reply via email to