From: Debian Qt/KDE Maintainers Date: Sun, 28 Apr 2024 18:48:02 +0000 (+0200) Subject: fix recursion crash when calling setStyleSheet with qproperty-styleSheet X-Git-Tag: archive/raspbian/5.15.8+dfsg-11+rpi1+deb12u2^2~38 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=706f17f1ffb9cd2058b3c601025c41ef88b87839;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 9fcb8ba52..da88f0b97 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -2649,6 +2649,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 26868a763..5d67ce5ac 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(); @@ -678,6 +679,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