Bug 484313 - KWin crash in KWin::Cursor::geometry when alt-tabbing out of a game on Wayland
Summary: KWin crash in KWin::Cursor::geometry when alt-tabbing out of a game on Wayland
Status: RESOLVED FIXED
Alias: None
Product: kwin
Classification: Plasma
Component: wayland-generic (other bugs)
Version First Reported In: 6.0.2
Platform: Arch Linux Linux
: NOR crash
Target Milestone: ---
Assignee: KWin default assignee
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2024-03-23 11:39 UTC by infernio
Modified: 2024-05-31 11:38 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description infernio 2024-03-23 11:39:05 UTC
SUMMARY
Sometimes when I alt-tab out of a game (Signalis run via Steam/Proton in my case), KWin crashes completely and restarts. All my applications will have been terminated.

STEPS TO REPRODUCE
I'm not sure how to reliably reproduce it. This seems to happen randomly (though rarely, I've only had it happen three times in total) when I'm playing Signalis and alt-tabbing out to Firefox.

OBSERVED RESULT
KWin crashes.

EXPECTED RESULT
KWin shouldn't crash in that case.

SOFTWARE/OS VERSIONS
KDE Plasma Version: 6.0.2
KDE Frameworks Version: 6.0.0
Qt Version: 6.6.2

ADDITIONAL INFORMATION
I'm only attaching the first 50 or so entries in the backtrace, it seems to keep going forever if I let it run - thousands of entries, all of this form:

#15461 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#15462 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#15463 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249

Anyway, backtrace:
#0  0x0000772a5578d1f5 in KWin::Cursor::geometry (this=0x6523ecf02870)
    at /usr/src/debug/kwin/kwin-6.0.2/src/cursor.cpp:192
#1  0x0000772a557681e1 in operator() (__closure=__closure@entry=0x6523ed0d2dd8)
    at /usr/src/debug/kwin/kwin-6.0.2/src/compositor_wayland.cpp:283
#2  0x0000772a55768ad0 in operator() (__closure=0x6523ed0d2dc0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/compositor_wayland.cpp:356
#3  QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, KWin::WaylandCompositor::addOutput(KWin::Output*)::<lambda()> >::call (arg=<optimized out>, f=...)
    at /usr/include/qt6/QtCore/qobjectdefs_impl.h:137
#4  QtPrivate::Functor<KWin::WaylandCompositor::addOutput(KWin::Output*)::<lambda()>, 0>::call<QtPrivate::List<>, void> (arg=<optimized out>, f=...) at /usr/include/qt6/QtCore/qobjectdefs_impl.h:339
#5  QtPrivate::QCallableObject<KWin::WaylandCompositor::addOutput(KWin::Output*)::<lambda()>, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *)
    (which=<optimized out>, this_=0x6523ed0d2db0, r=<optimized out>, a=<optimized out>, ret=<optimized out>) at /usr/include/qt6/QtCore/qobjectdefs_impl.h:522
#6  0x0000772a52f90ca9 in QtPrivate::QSlotObjectBase::call
    (a=0x7ffcb9878570, r=0x6523ecf405c0, this=0x6523ed0d2db0, this=<optimized out>, r=<optimized out>, a=<optimized out>)
    at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.2/src/corelib/kernel/qobjectdefs_impl.h:433
#7  doActivate<false> (sender=0x6523ecf28a10, signal_index=5, argv=0x7ffcb9878570)
    at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.2/src/corelib/kernel/qobject.cpp:4039
#8  0x0000772a5578e60c in KWin::Cursors::positionChanged
    (this=<optimized out>, _t1=<optimized out>, _t2=<optimized out>)
    at /usr/src/debug/kwin/build/src/kwin_autogen/include/moc_cursor.cpp:534
#9  0x0000772a52f90ca9 in QtPrivate::QSlotObjectBase::call
    (a=0x7ffcb9878680, r=0x6523ecf28a10, this=0x6523ecf06db0, this=<optimized out>, r=<optimized out>, a=<optimized out>)
    at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.2/src/corelib/kernel/qobjectdefs_impl.h:433
#10 doActivate<false> (sender=0x6523ecf02870, signal_index=3, argv=0x7ffcb9878680)
    at /usr/src/debug/qt6-base/qtbase-everywhere-src-6.6.2/src/corelib/kernel/qobject.cpp:4039
#11 0x0000772a5578e3d7 in KWin::Cursor::posChanged (this=<optimized out>, _t1=<optimized out>)
    at /usr/src/debug/kwin/build/src/kwin_autogen/include/moc_cursor.cpp:304
#12 0x0000772a5589b833 in KWin::InputRedirectionCursor::slotPosChanged
    (this=this@entry=0x6523ecf02870, pos=...)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:1136
#13 0x0000772a5589bcd2 in KWin::InputRedirectionCursor::doSetPos (this=0x6523ecf02870)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:1129
#14 0x0000772a558cd622 in KWin::Edge::pushCursorBack (this=<optimized out>, cursorPos=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/screenedge.cpp:537
#15 KWin::Edge::pushCursorBack (this=this@entry=0x6523ee393b30, cursorPos=...)
    at /usr/src/debug/kwin/kwin-6.0.2/src/screenedge.cpp:517
#16 0x0000772a558d300f in KWin::Edge::check
    (this=this@entry=0x6523ee393b30, cursorPos=..., triggerTime=..., forceNoPushBack=forceNoPushBack@entry=false) at /usr/src/debug/kwin/kwin-6.0.2/src/screenedge.cpp:325
#17 0x0000772a558d3318 in KWin::ScreenEdges::isEntered (event=0x7ffcb9878900, this=0x6523ecf00ae0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/screenedge.cpp:1449
#18 KWin::ScreenEdges::isEntered (this=0x6523ecf00ae0, event=0x7ffcb9878900)
    at /usr/src/debug/kwin/kwin-6.0.2/src/screenedge.cpp:1423
#19 0x0000772a5580c2d4 in KWin::ScreenEdgeInputFilter::pointerEvent
    (this=<optimized out>, event=0x7ffcb9878900, nativeButton=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/input.cpp:1646
#20 0x0000772a55896338 in std::__invoke_impl<bool, bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&>
    (__f=<optimized out>, __t=@0x6523ed0fbae8: 0x6523ed01df00)
--Type <RET> for more, q to quit, c to continue without paging--
    at /usr/include/c++/13.2.1/bits/invoke.h:71
#21 std::__invoke<bool (KWin::InputEventFilter::*&)(KWin::MouseEvent*, unsigned int), KWin::InputEventFilter* const&, KWin::MouseEvent*&, int&> (__fn=<optimized out>)
    at /usr/include/c++/13.2.1/bits/invoke.h:96
#22 std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::__call<bool, KWin::InputEventFilter* const&, 0ul, 1ul, 2ul>(std::tuple<KWin::InputEventFilter* const&>&&, std::_Index_tuple<0ul, 1ul, 2ul>)
    (__args=<optimized out>, this=<optimized out>) at /usr/include/c++/13.2.1/functional:506
#23 std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>::operator()<KWin::InputEventFilter* const&, bool>(KWin::InputEventFilter* const&) (this=<optimized out>) at /usr/include/c++/13.2.1/functional:591
#24 __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >::operator()<QList<KWin::InputEventFilter*>::const_iterator>(QList<KWin::InputEventFilter*>::const_iterator) (__it=..., this=<optimized out>)
    at /usr/include/c++/13.2.1/bits/predefined_ops.h:318
#25 std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >, std::random_access_iterator_tag)
    (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algobase.h:2080
#26 std::__find_if<QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> > >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, __gnu_cxx::__ops::_Iter_pred<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >) (__pred=..., __last=..., __first=...)
    at /usr/include/c++/13.2.1/bits/stl_algobase.h:2117
#27 std::find_if<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>)
    (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:3923
#28 std::none_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>)
    (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:477
#29 std::any_of<QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(QList<KWin::InputEventFilter*>::const_iterator, QList<KWin::InputEventFilter*>::const_iterator, std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>)
    (__pred=..., __last=..., __first=...) at /usr/include/c++/13.2.1/bits/stl_algo.h:496
#30 KWin::InputRedirection::processFilters<std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)> >(std::_Bind<bool (KWin::InputEventFilter::*(std::_Placeholder<1>, KWin::MouseEvent*, int))(KWin::MouseEvent*, unsigned int)>)
    (function=..., this=<optimized out>) at /usr/src/debug/kwin/kwin-6.0.2/src/input.h:194
#31 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:248
#32 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#33 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#34 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#35 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#36 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#37 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#38 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#39 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#40 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#41 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#42 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#43 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#44 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#45 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#46 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#47 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#48 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:180
#49 KWin::PointerInputRedirection::processMotionInternal
    (this=this@entry=0x6523eccddef0, pos=..., delta=..., deltaNonAccelerated=..., time=std::chrono::duration = { <optimized out>us }, device=device@entry=0x0)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:249
#56 0x0000772a558965dd in KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
    at /usr/src/debug/kwin/kwin-6.0.2/src/pointer_input.cpp:186
#57 KWin::PositionUpdateBlocker::~PositionUpdateBlocker
    (this=<synthetic pointer>, this=<optimized out>)
Comment 1 Vlad Zahorodnii 2024-05-31 11:38:10 UTC
This should be fixed in https://invent.kde.org/plasma/kwin/-/commit/44b72823c2c3b5c71bf9617aea405c585d8ecab6