From c70c1d54f437e77f1e75b3f438b4c3dd6f1ce5a0 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Mon, 29 May 2017 13:45:25 +0200 Subject: QStackedLayout: Fix UB (invalid cast) in qt_wasDeleted() Fixup of commit b4995eb7491c1b4784a1bf48db834c11c42b8d9d. We can't call QWidgetPrivate::get(w) on a deleted QWidget, because of the call to the member function QWidget::d_func. We can however call QObjectPrivate::get since we still are in the QObject destructor. tst_qstackedlayout now pass without ubsan Warnings. Change-Id: I4e839a97ddbd1cf21435a8fca76523b98a1f7d9b Reviewed-by: Marc Mutz --- src/corelib/kernel/qobject_p.h | 1 + src/widgets/kernel/qstackedlayout.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index a7d7ef0889..7b9253ac64 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -198,6 +198,7 @@ public: static QObjectPrivate *get(QObject *o) { return o->d_func(); } + static const QObjectPrivate *get(const QObject *o) { return o->d_func(); } int signalIndex(const char *signalName, const QMetaObject **meta = 0) const; inline bool isSignalConnected(uint signalIdx, bool checkDeclarative = true) const; diff --git a/src/widgets/kernel/qstackedlayout.cpp b/src/widgets/kernel/qstackedlayout.cpp index d9c1c524d7..b8b6f4302d 100644 --- a/src/widgets/kernel/qstackedlayout.cpp +++ b/src/widgets/kernel/qstackedlayout.cpp @@ -253,7 +253,7 @@ QLayoutItem *QStackedLayout::itemAt(int index) const // on the object then) static bool qt_wasDeleted(const QWidget *w) { - return QWidgetPrivate::get(w)->wasDeleted; + return QObjectPrivate::get(w)->wasDeleted; } -- cgit v1.2.3