From e2e1a5179068643c288bfe773cf00faf4603753c Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Sun, 16 Apr 2023 00:16:52 +0200 Subject: [PATCH] fix: UB by erroneous event downcasting When an event type is `QEvent::Wheel`, the event type is `QWheelEvent`, which is not a `QMouseEvent`. This caused a undefined behavior that can be cached by ubsan. --- src/Gui/Quarter/QuarterWidget.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Gui/Quarter/QuarterWidget.cpp b/src/Gui/Quarter/QuarterWidget.cpp index f7716d1a9d..f43c168712 100644 --- a/src/Gui/Quarter/QuarterWidget.cpp +++ b/src/Gui/Quarter/QuarterWidget.cpp @@ -936,8 +936,7 @@ bool QuarterWidget::viewportEvent(QEvent* event) // additionally handle it by this viewer. This is e.g. needed when // resizing a widget item because the cursor may already be outside // this widget. - if (event->type() == QEvent::Wheel || - event->type() == QEvent::MouseButtonDblClick || + if (event->type() == QEvent::MouseButtonDblClick || event->type() == QEvent::MouseButtonPress) { QMouseEvent* mouse = static_cast(event); QGraphicsItem *item = itemAt(mouse->pos()); @@ -954,6 +953,19 @@ bool QuarterWidget::viewportEvent(QEvent* event) return false; } } + else if (event->type() == QEvent::Wheel) { + auto wheel = static_cast(event); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QPoint pos = wheel->pos(); +#else + QPoint pos = wheel->position().toPoint(); +#endif + QGraphicsItem* item = itemAt(pos); + if (!item) { + QGraphicsView::viewportEvent(event); + return false; + } + } return QGraphicsView::viewportEvent(event); }