Revert "Handle the QWidgetPrivate::mapper structure"
This reverts commit 90de48493be283b9afb249f6a0fd8dbd8958517d.
The call isn't necessary, but invokes undefined behavior.
It invokes undefined behavior because deleteTLSysExtra() is called
from deleteExtra(), which is called from ~QWidgetPrivate(), which is
called from ~QObject(). Thus, by the time we call q->windowType()
within setWinId(), q is no longer a QWidget, but only a QObject, and
calling a QWidget member function then is UB.
UBSan confirms:
qwidget_p.h:300:5: runtime error: downcast of address 0x2afdd4053620 which does not point to an object of type 'QWidget' (the Q_Q macro)
0x2afdd4053620: note: object is of type 'QObject'
qwidget.cpp:1712:93: runtime error: member call on address 0x2afdd4053620 which does not point to an object of type 'QWidget'
0x2afdd4053620: note: object is of type 'QObject'
It is also unnecessary:
deleteTLSysExtra() is called from two places: QWidget::destroy() and
deleteExtra(). deleteExtra() is only called from ~QWidgetPrivate()
which is only called from ~QObject() called by ~QWidget(), which,
however, already calls QWidget::destroy(). QWidget::destroy(), in
turn, unconditionally (for non-desktop widgets, at least) calls
setWinId(0) itself.
So fix the UB by removing the call without replacement.
Conflicts:
src/gui/kernel/qwidget_qpa.cpp
Change-Id: Ib3a8cc9d28a096183f1d3dfd1941ea5fdc6a4aac
Reviewed-by:
Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Showing
Please register or sign in to comment