From: Debian Qt/KDE Maintainers Date: Sat, 2 Apr 2022 18:23:38 +0000 (+0100) Subject: fix recursion crash when calling setStyleSheet with qproperty-styleSheet X-Git-Tag: archive/raspbian/5.15.2+dfsg-16+rpi1^2~18 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=3273109c2d27f6e6ef4ed51e2e04a607baebdf28;p=qtbase-opensource-src.git fix recursion crash when calling setStyleSheet with qproperty-styleSheet Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=e9cdcc7cb314586a Last-Update: 2021-11-13 When calling setStyleSheet with property qproperty-styleSheet, QStyleSheetStyle::polish will call QStyleSheetStyle::setProperties, and then QStyleSheetStyle::setProperties goes on to call setProperty. Because there is property qproperty-styleSheet, it will update stylesheet by calling QStyleSheetStyle::polish. This causes the recursive call to crash. Gbp-Pq: Name fix_recursion_crash.diff --- diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index 14bca7fbe..3eeeaa1d8 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -2626,6 +2626,9 @@ void QStyleSheetStyle::setProperties(QWidget *w) default: v = decl.d->values.at(0).variant; break; } + if (propertyL1 == QByteArray("styleSheet") && value == v) + continue; + w->setProperty(propertyL1, v); } } diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp index 82527849b..5c143e71f 100644 --- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp +++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp @@ -94,6 +94,7 @@ private slots: void layoutSpacing(); #endif void qproperty(); + void qproperty_styleSheet(); void palettePropagation_data(); void palettePropagation(); void fontPropagation_data(); @@ -677,6 +678,23 @@ void tst_QStyleSheetStyle::qproperty() QCOMPARE(pb.isChecked(), false); } +void tst_QStyleSheetStyle::qproperty_styleSheet() +{ + QWidget w; + auto checkBox = new QCheckBox("check", &w); + QString sheet = R"(QCheckBox { qproperty-styleSheet: "QCheckBox { qproperty-text: foobar; }"; })"; + + QVERIFY(w.property("styleSheet").toString().isEmpty()); + + w.setStyleSheet(sheet); + QCOMPARE(checkBox->text(), "check"); + + //recursion crash + w.ensurePolished(); + QCOMPARE(w.property("styleSheet").toString(), sheet); + QCOMPARE(checkBox->text(), "foobar"); +} + namespace ns { class PushButton1 : public QPushButton { Q_OBJECT