diff --git a/qt5-qtwayland.spec b/qt5-qtwayland.spec index d66831f..d245e8b 100644 --- a/qt5-qtwayland.spec +++ b/qt5-qtwayland.spec @@ -3,7 +3,7 @@ Summary: Qt5 - Wayland platform support and QtCompositor module Name: qt5-%{qt_module} Version: 5.14.2 -Release: 2%{?dist} +Release: 3%{?dist} License: LGPLv3 Url: http://www.qt.io @@ -16,6 +16,11 @@ Source0: https://download.qt.io/official_releases/qt/%{majmin}/%{version}/submod # https://bugzilla.redhat.com/show_bug.cgi?id=1823984 Patch0: qtwayland-dont-force-gamma-correction-off.patch +# Transferring large amounts of data via clipboard may lead to +# stack overflow and segmentation fault because of recursion in +# QtWaylandClient::QWaylandMimeData::readData(). +Patch1: qtwayland-remove-recursion-in-data-offer-retrieval.patch + # Upstreamable patches # https://fedoraproject.org/wiki/Changes/Qt_Wayland_By_Default_On_Gnome # https://bugzilla.redhat.com/show_bug.cgi?id=1732129 @@ -126,6 +131,9 @@ popd %changelog +* Thu Apr 30 2020 Ivan Mironov - 5.14.2-3 +- Cherry-pick fix for clipboard related crash from v5.15.0 + * Tue Apr 21 2020 Jan Grulich - 5.14.2-2 - Fix bold font rendering Resolves: bz#1823984 diff --git a/qtwayland-remove-recursion-in-data-offer-retrieval.patch b/qtwayland-remove-recursion-in-data-offer-retrieval.patch new file mode 100644 index 0000000..b2e4243 --- /dev/null +++ b/qtwayland-remove-recursion-in-data-offer-retrieval.patch @@ -0,0 +1,64 @@ +From 80bf946e78b5b5b4276668249eb1fab769259426 Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Tue, 23 Jul 2019 08:44:46 +0200 +Subject: [PATCH] Client: Remove recursion in data offer retrieval + +A loop functions just as well is more readable and uses less stack +memory. + +Change-Id: I6f6c6b7b8047c42080fb8b9e0bc3eae96f8872ab +Reviewed-by: David Faure +Reviewed-by: Johan Helsing +--- + src/client/qwaylanddataoffer.cpp | 37 +++++++++++++++++--------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +diff --git a/src/client/qwaylanddataoffer.cpp b/src/client/qwaylanddataoffer.cpp +index 4c06277f..2297e8a1 100644 +--- a/src/client/qwaylanddataoffer.cpp ++++ b/src/client/qwaylanddataoffer.cpp +@@ -170,24 +170,27 @@ int QWaylandMimeData::readData(int fd, QByteArray &data) const + timeout.tv_sec = 1; + timeout.tv_usec = 0; + +- int ready = select(FD_SETSIZE, &readset, nullptr, nullptr, &timeout); +- if (ready < 0) { +- qWarning() << "QWaylandDataOffer: select() failed"; +- return -1; +- } else if (ready == 0) { +- qWarning("QWaylandDataOffer: timeout reading from pipe"); +- return -1; +- } else { +- char buf[4096]; +- int n = QT_READ(fd, buf, sizeof buf); +- +- if (n > 0) { +- data.append(buf, n); +- n = readData(fd, data); +- } else if (n < 0) { +- qWarning("QWaylandDataOffer: read() failed"); ++ Q_FOREVER { ++ int ready = select(FD_SETSIZE, &readset, nullptr, nullptr, &timeout); ++ if (ready < 0) { ++ qWarning() << "QWaylandDataOffer: select() failed"; ++ return -1; ++ } else if (ready == 0) { ++ qWarning("QWaylandDataOffer: timeout reading from pipe"); ++ return -1; ++ } else { ++ char buf[4096]; ++ int n = QT_READ(fd, buf, sizeof buf); ++ ++ if (n < 0) { ++ qWarning("QWaylandDataOffer: read() failed"); ++ return -1; ++ } else if (n == 0) { ++ return 0; ++ } else if (n > 0) { ++ data.append(buf, n); ++ } + } +- return n; + } + } +