From 06e0d9f46feae2981bd7e61b2827652e3fbc5c4cbd34b0897ce9dbf0180845fa Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Tue, 18 Oct 2016 08:03:41 +0000 Subject: [PATCH] Accepting request 435736 from KDE:Qt5 - Add fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch: fix Plasma screenlocker crash on unlock (boo#999548, QTBUG#51927) - masm-unaligned-stack-pointer.patch: align stack on 16 byte boundaries in the YarrJIT (bsc#1003880) OBS-URL: https://build.opensuse.org/request/show/435736 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtdeclarative?expand=0&rev=35 --- ...efault-property-aliases-with-layouts.patch | 186 ++++++++++++++++++ libqt5-qtdeclarative.changes | 12 ++ libqt5-qtdeclarative.spec | 6 + masm-unaligned-stack-pointer.patch | 66 +++++++ 4 files changed, 270 insertions(+) create mode 100644 fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch create mode 100644 masm-unaligned-stack-pointer.patch diff --git a/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch b/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch new file mode 100644 index 0000000..56bc871 --- /dev/null +++ b/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch @@ -0,0 +1,186 @@ +From 5149aa68eca6ede8836ec4f07a14d22d9da9b161 Mon Sep 17 00:00:00 2001 +From: Mitch Curtis +Date: Tue, 13 Sep 2016 12:42:12 +0200 +Subject: [PATCH 1/1] Fix crash on exit when using default property aliases + with layouts + +The layout was being destroyed before the text, which meant that the +removeItemChangeListener() call never got hit. To ensure that the +listener is always removed, loop through each child in QQuickLayout's +destructor. + +This is a manual cherry-pick of +59c6c0e0b1b5b46747595a58e11311b7393d7e70. + +Task-number: QTBUG-51927 +Change-Id: I669f42beb8c3dd6b4b741cae0b16e017bb3409df +Reviewed-by: J-P Nurmi +--- + src/imports/layouts/qquicklayout.cpp | 4 ++ + .../qquicklayouts/data/rowlayout/Container.qml | 55 ++++++++++++++++++++++ + .../qquicklayouts/data/rowlayout/ContainerUser.qml | 53 +++++++++++++++++++++ + .../quick/qquicklayouts/data/tst_rowlayout.qml | 12 +++++ + 4 files changed, 124 insertions(+) + create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml + create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml + +diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp +index abc8f97..9914826 100644 +--- a/src/imports/layouts/qquicklayout.cpp ++++ b/src/imports/layouts/qquicklayout.cpp +@@ -698,6 +698,10 @@ QQuickLayout::QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent) + QQuickLayout::~QQuickLayout() + { + d_func()->m_isReady = false; ++ ++ const auto childItems = d_func()->childItems; ++ for (QQuickItem *child : childItems) ++ QQuickItemPrivate::get(child)->removeItemChangeListener(this, QQuickItemPrivate::SiblingOrder); + } + + QQuickLayoutAttached *QQuickLayout::qmlAttachedProperties(QObject *object) +diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml +new file mode 100644 +index 0000000..22205c1 +--- /dev/null ++++ b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml +@@ -0,0 +1,55 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2016 The Qt Company Ltd. ++** Contact: http://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** You may use this file under the terms of the BSD license as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2.7 ++import QtQuick.Layouts 1.3 ++ ++Item { ++ objectName: "qtbug51927-window" ++ visible: true ++ ++ default property alias _contents: customContent.data ++ ++ RowLayout { ++ id: customContent ++ objectName: "qtbug51927-columnLayout" ++ anchors.fill: parent ++ } ++} +diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml +new file mode 100644 +index 0000000..ff7ce62 +--- /dev/null ++++ b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml +@@ -0,0 +1,53 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2016 The Qt Company Ltd. ++** Contact: http://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** You may use this file under the terms of the BSD license as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2.6 ++import QtQuick.Window 2.2 ++ ++Container { ++ visible: true ++ ++ Text { ++ objectName: "qtbug51927-text" ++ text: qsTr("Hello World") ++ anchors.centerIn: parent ++ renderType: Text.QtRendering ++ } ++} +diff --git a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +index 33b8fd0..2d4e227 100644 +--- a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml ++++ b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +@@ -926,5 +926,17 @@ Item { + waitForRendering(layout) + layout.destroy() + } ++ ++ ++ function test_defaultPropertyAliasCrash() { ++ var containerUserComponent = Qt.createComponent("rowlayout/ContainerUser.qml"); ++ compare(containerUserComponent.status, Component.Ready); ++ ++ var containerUser = containerUserComponent.createObject(testCase); ++ verify(containerUser); ++ ++ // Shouldn't crash. ++ containerUser.destroy(); ++ } + } + } +-- +2.7.4 + diff --git a/libqt5-qtdeclarative.changes b/libqt5-qtdeclarative.changes index f2c5ddf..e8e02a6 100644 --- a/libqt5-qtdeclarative.changes +++ b/libqt5-qtdeclarative.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Mon Oct 17 11:34:00 UTC 2016 - lbeltrame@kde.org + +- Add fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch: + fix Plasma screenlocker crash on unlock (boo#999548, QTBUG#51927) + +------------------------------------------------------------------- +Tue Oct 11 08:28:26 UTC 2016 - schwab@suse.de + +- masm-unaligned-stack-pointer.patch: align stack on 16 byte boundaries in + the YarrJIT (bsc#1003880) + ------------------------------------------------------------------- Wed Sep 28 17:06:29 UTC 2016 - fabian@ritter-vogt.de diff --git a/libqt5-qtdeclarative.spec b/libqt5-qtdeclarative.spec index c9de497..2fb9ac9 100644 --- a/libqt5-qtdeclarative.spec +++ b/libqt5-qtdeclarative.spec @@ -43,6 +43,10 @@ Patch3: V4-Always-set-the-tag-when-boxing-a-pointer.patch Patch4: Add-a-facility-to-version-type-information.patch # PATCH-FIX-UPSTREAM V4-Free-up-2-address-bits-in-64bit-mode.patch Patch5: V4-Free-up-2-address-bits-in-64bit-mode.patch +# PATCH-FIX-UPSTREAM masm-unaligned-stack-pointer.patch +Patch6: masm-unaligned-stack-pointer.patch +# PATCH-FIX-UPSTREAM fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch - fixes crashes in screenloker (boo#999548) +Patch7: fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch BuildRequires: fdupes BuildRequires: libQt5Core-private-headers-devel >= %{version} BuildRequires: libQt5Gui-private-headers-devel >= %{version} @@ -86,6 +90,8 @@ handling. %ifarch aarch64 %patch5 -p1 %endif +%patch6 -p1 +%patch7 -p1 %package -n %libname Summary: Qt 5 Declarative Library diff --git a/masm-unaligned-stack-pointer.patch b/masm-unaligned-stack-pointer.patch new file mode 100644 index 0000000..f0a1921 --- /dev/null +++ b/masm-unaligned-stack-pointer.patch @@ -0,0 +1,66 @@ +From 4493524ec24afb946eba3942f48d9fc1ff3192c1 Mon Sep 17 00:00:00 2001 +From: Erik Verbruggen +Date: Tue, 9 Aug 2016 10:49:22 +0200 +Subject: [PATCH] V4: Align stack on 16 byte boundaries in the YarrJIT + +This is the required alignment for Aarch64, and a number of other ABIs +prefer this size too when calling into system libraries. + +Change-Id: Ie38cabb77cf83543b915553e69c5c5728a67503b +Reviewed-by: Simon Hausmann +--- + src/3rdparty/masm/yarr/YarrJIT.cpp | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/src/3rdparty/masm/yarr/YarrJIT.cpp b/src/3rdparty/masm/yarr/YarrJIT.cpp +index 5664c585b9..d8211ec4b2 100644 +--- a/src/3rdparty/masm/yarr/YarrJIT.cpp ++++ b/src/3rdparty/masm/yarr/YarrJIT.cpp +@@ -338,17 +338,31 @@ class YarrGenerator : private MacroAssembler { + jump(Address(stackPointerRegister, frameLocation * sizeof(void*))); + } + ++ unsigned alignCallFrameSizeInBytes(unsigned callFrameSize) ++ { ++ callFrameSize *= sizeof(void*); ++ if (callFrameSize / sizeof(void*) != m_pattern.m_body->m_callFrameSize) ++ CRASH(); ++ // Originally, the code was: ++// callFrameSize = (callFrameSize + 0x3f) & ~0x3f; ++ // However, 64 bytes is a bit surprising. The biggest "alignment" requirement is on Aarch64, where: ++ // "SP mod 16 = 0. The stack must be quad-word aligned." (IHI0055B_aapcs64.pdf) ++ callFrameSize = (callFrameSize + 0xf) & ~0xf; ++ if (!callFrameSize) ++ CRASH(); ++ return callFrameSize; ++ } + void initCallFrame() + { + unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; + if (callFrameSize) +- subPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); ++ subPtr(Imm32(alignCallFrameSizeInBytes(callFrameSize)), stackPointerRegister); + } + void removeCallFrame() + { + unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; + if (callFrameSize) +- addPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); ++ addPtr(Imm32(alignCallFrameSizeInBytes(callFrameSize)), stackPointerRegister); + } + + // Used to record subpatters, should only be called if compileMode is IncludeSubpatterns. +@@ -2565,6 +2579,10 @@ class YarrGenerator : private MacroAssembler { + if (compileMode == IncludeSubpatterns) + loadPtr(Address(X86Registers::ebp, 2 * sizeof(void*)), output); + #endif ++#elif CPU(ARM64) ++ // The ABI doesn't guarantee the upper bits are zero on unsigned arguments, so clear them ourselves. ++ zeroExtend32ToPtr(index, index); ++ zeroExtend32ToPtr(length, length); + #elif CPU(ARM) + push(ARMRegisters::r4); + push(ARMRegisters::r5); +-- +2.10.1 +