diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2018-10-03 17:09:40 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2018-10-13 18:55:29 +0000 |
commit | 7f57472e24a45a9cb56c7742f4c031405262ef98 (patch) | |
tree | 9226093e3c34ce4f32870404a0196f1fc05d3d05 /src/quick/items/qquickwindow.cpp | |
parent | 1ce94fc0f5311c8d9d7dc50de239a827279edcd9 (diff) |
Warn, don't crash during nested delivery of mouse or touch presses
If during delivery of a mouse press, user code calls qApp->sendEvent()
with another mouse press, then when delivery of the nested event is
finished, we call QQuickPointerMouseEvent::reset(nullptr). Then when
delivery of the original mouse press resumes, crashes are possible
because most of the code assumes that QQuickPointerEvent::m_event is
not null during delivery.
Change-Id: Id65b1f2f64351e40d03bcd4f4d16693d616729da
Fixes: QTBUG-70898
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/quick/items/qquickwindow.cpp')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 1c44afc594..53c0231f87 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2508,6 +2508,10 @@ bool QQuickWindowPrivate::deliverPressOrReleaseEvent(QQuickPointerEvent *event, } for (QQuickItem *item : targetItems) { + if (!event->m_event) { + qWarning("event went missing during delivery! (nested sendEvent() is not allowed)"); + break; + } if (!handlersOnly && sendFilteredPointerEvent(event, item)) { if (event->isAccepted()) { for (int i = 0; i < event->pointCount(); ++i) @@ -2521,6 +2525,10 @@ bool QQuickWindowPrivate::deliverPressOrReleaseEvent(QQuickPointerEvent *event, // nor to any item which already had a chance to filter. if (skipDelivery.contains(item)) continue; + if (!event->m_event) { + qWarning("event went missing during delivery! (nested sendEvent() is not allowed)"); + break; + } deliverMatchingPointsToItem(item, event, handlersOnly); if (event->allPointsAccepted()) handlersOnly = true; |