copy/pasting in krita crashes the program
This has been happening to me lately very commonly, and copy/pasting is something I do sometimes, I was following this bug report on the krita side but they point to xfce as the culprit. https://bugs.kde.org/show_bug.cgi?id=502266 But then I came here and I don't see any bug report related to it, and that one was closed "because it was xfce's issue" My rough config: xfce4 + x11 CPU AMD Ryzen 9 7900x GPU nvidia rtx 4070ti super Graphics tablet: huion kamvas pro 24 4k RAM: 64 Gb I can reproduce it deterministically by doing the following: * open krita * draw something (optional) * select an area (I do it with the free select tool) * copy * paste * paste (this crashes) The second paste crashes for me, but I believe in other circumstances I have seen a first paste crashing it.. [backtrace-krita.txt](/uploads/af465d4c5a4f03f3088ab8a96c5a94b8/backtrace-krita.txt) This is the whole backtrace of the thing, but I believe that all the 87 threads are not important other than the thread 1 here: ``` Thread 1 (Thread 0x7fffefd96dc0 (LWP 509744) "krita"): #0 0x00007ffff54b06b2 in __cxxabiv1::__dynamic_cast (src_ptr=0x55555a293ef0, src_type=0x7ffff737f598 <typeinfo for KisNode>, dst_type=0x7ffff737f230 <typeinfo for KisCloneLayer>, src2dst=0) at /usr/src/debug/gcc/gcc/libstdc++-v3/libsupc++/dyncast.cc:58 vtable = 0x55500f7c9783 prefix = 0x55500f7c9773 whole_ptr = <optimized out> whole_type = <optimized out> result = {dst_ptr = 0x7fffffffc010, whole2dst = 4111092942, whole2src = 32767, dst2src = __cxxabiv1::__class_type_info::__unknown, whole_details = 0} whole_vtable = <optimized out> whole_prefix = <optimized out> #1 0x00007ffff7870680 in (anonymous namespace)::safeCopyNode (node=..., detachClones=true) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_mimedata.cpp:53 cloneLayer = {d = <optimized out>} #2 0x00007ffff787b346 in KisMimeData::tryLoadInternalNodes (data=data@entry=0x555556b334f0, image=..., shapeController=0x555559e70150, copyNode=@0x7fffffffc25c: false) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_mimedata.cpp:295 node = {d = 0x55555a293ef0} _container_294 = {c = {<QListSpecialMethods<KisSharedPtr<KisNode> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x555556cdcb20}, d = 0x555556cdcb20}}, i = {i = 0x555556cdcb30}, e = {i = 0x555556cdcb38}, control = 1} lock = {<KisAdaptedLock<KisImageBarrierLockAdapterImpl<KisSharedPtr<KisImage>, true> >> = {<KisImageBarrierLockAdapterImpl<KisSharedPtr<KisImage>, true>> = {m_image = {d = 0x0}}, <std::unique_lock<KisImageBarrierLockAdapterImpl<KisSharedPtr<KisImage>, true> >> = {_M_device = 0x7fffffffc100, _M_owns = false}, <No data fields>}, <No data fields>} clones = {<QListSpecialMethods<KisSharedPtr<KisNode> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x7ffff5bbb0d0 <QListData::shared_null>}, d = 0x7ffff5bbb0d0 <QListData::shared_null>}} nodes = {<QListSpecialMethods<KisSharedPtr<KisNode> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x555556cdcb20}, d = 0x555556cdcb20}} forceCopy = <optimized out> sourceImage = {d = <optimized out>} mimedata = <optimized out> #3 0x00007ffff787c9a2 in KisMimeData::loadNodesFast (data=0x555556b334f0, image=..., shapeController=<optimized out>, copyNode=@0x7fffffffc25c: false) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_mimedata.cpp:428 nodes = {<QListSpecialMethods<KisSharedPtr<KisNode> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x555556cdcb20}, d = 0x555556cdcb20}} #4 0x00007ffff787cd96 in KisMimeData::insertMimeLayers (data=<optimized out>, image=..., shapeController=<optimized out>, parentDummy=<optimized out>, aboveThisDummy=<optimized out>, copyNode=<optimized out>, nodeInsertionAdapter=0x555556b36180, changeOffset=false, offset=..., applicator=0x0) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_mimedata.cpp:468 nodes = {<QListSpecialMethods<KisSharedPtr<KisNode> >> = {<No data fields>}, {p = {static shared_null = {ref = {atomic = {_q_value = std::atomic<int> = { -1 }}}, alloc = 0, begin = 0, end = 0, array = {0x0}}, d = 0x555556cdcb20}, d = 0x555556cdcb20}} result = <optimized out> aboveThisNode = {d = <optimized out>} hasDelayedNodes = <optimized out> #5 0x00007ffff78897f7 in KisNodeManager::pasteLayersFromClipboard (this=0x555556b340f0, changeOffset=<optimized out>, offset=..., applicator=0x0) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_node_manager.cpp:1514 data = 0x555556b334f0 activeNode = {d = 0x555556cb3710} shapeController = 0x555559e70150 dummiesFacade = <optimized out> copyNode = false image = {d = <optimized out>} parentDummy = 0x55555a516650 aboveThisDummy = 0x0 #6 0x00007ffff7aa7c86 in KisPasteActionFactory::run (this=0x7fffffffc790, flags=..., view=0x555556b33160) at /usr/src/debug/krita/krita-5.2.13/libs/ui/actions/KisPasteActionFactories.cpp:275 offsetTopLeft = {xp = <optimized out>, yp = <optimized out>} pasteAtCursorPosition = <optimized out> image = {d = 0x555558b97160} docPos = {xp = 559.64411964942815, yp = 171.13363610510257} fittingBounds = {x1 = 0, y1 = 0, x2 = 3839, y2 = 2159} range = {<boost::operators_impl::equality_comparable<KisTimeSpan, KisTimeSpan, boost::operators_impl::operators_detail::empty_base<KisTimeSpan>, boost::operators_impl::operators_detail::false_t>> = {<boost::operators_impl::equality_comparable1<KisTimeSpan, boost::operators_impl::operators_detail::empty_base<KisTimeSpan> >> = {<boost::operators_impl::operators_detail::empty_base<KisTimeSpan>> = {<No data fields>}, <No data fields>}, <No data fields>}, m_start = 1480289744, m_end = 21845} clip = {d = 0x7ffff47a4dee <KXmlGuiWindow::event(QEvent*)+46>} #7 0x00007ffff78ec2f7 in KisSelectionManager::paste (this=0x555556b33e18) at /usr/src/debug/krita/krita-5.2.13/libs/ui/kis_selection_manager.cc:359 factory = {<KisOperation> = {_vptr.KisOperation = 0x7ffff7d7b598 <vtable for KisPasteActionFactory+16>, m_id = {d = 0x55555ad2c640}}, <No data fields>} #8 0x00007ffff5b07705 in doActivate<false> (sender=0x555558668870, signal_index=4, argv=0x7fffffffc8b0) at kernel/qobject.cpp:3940 method_relative = <optimized out> callFunction = <optimized out> methodIndex = 0 receiver = 0x555556b33e18 td = <optimized out> receiverInSameThread = <optimized out> senderData = {previous = 0x0, receiver = 0x555556b33e18, sender = 0x555558668870, signal = 4} c = 0x555558671a50 connections = {d = 0x5555586720a0} list = 0x55555866a0a0 inSenderThread = <optimized out> highestConnectionId = 5 signalVector = 0x55555866a040 currentThreadId = 0x7fffefd96dc0 sp = <optimized out> signal_spy_set = 0x0 empty_argv = {0x0} senderDeleted = false #9 0x00007ffff674a705 in QAction::triggered (this=this@entry=0x555558668870, _t1=<optimized out>) at .moc/moc_qaction.cpp:376 _a = {0x0, 0x7fffffffc8ac} #10 0x00007ffff6750640 in QAction::activate (this=0x555558668870, event=<optimized out>) at kernel/qaction.cpp:1161 guard = {wp = {d = <optimized out>, value = <optimized out>}} d = <optimized out> #11 0x00007ffff675073e in QAction::event (this=<optimized out>, e=<optimized out>) at kernel/qaction.cpp:1086 se = <optimized out> #12 QAction::event (this=<optimized out>, e=<optimized out>) at kernel/qaction.cpp:1075 se = <optimized out> #13 0x00007ffff6758626 in QApplicationPrivate::notify_helper (this=this@entry=0x7fff00000004, receiver=receiver@entry=0x555558668870, e=e@entry=0x7fffffffcb40) at kernel/qapplication.cpp:3640 consumed = false filtered = false #14 0x00007ffff675c9b4 in QApplication::notify (this=this@entry=0x7fffffffd1d0, receiver=receiver@entry=0x555558668870, e=e@entry=0x7fffffffcb40) at kernel/qapplication.cpp:3386 w = <optimized out> extra = <optimized out> isProxyWidget = <optimized out> d = <optimized out> res = false #15 0x00007ffff7b01d4f in KisApplication::notify (this=0x7fffffffd1d0, receiver=0x555558668870, event=0x7fffffffcb40) at /usr/src/debug/krita/krita-5.2.13/libs/ui/KisApplication.cpp:771 guard = {m_info = 0x555555f0ce80} result = true info = @0x555555f0ce80: {eventRecursionCount = 1, postponedSynchronizationEvents = std::queue wrapping: std::deque with 0 elements} #16 0x00007ffff5ad0448 in QCoreApplication::notifyInternal2 (receiver=0x555558668870, event=0x7fffffffcb40) at kernel/qcoreapplication.cpp:1064 selfRequired = true result = false cbdata = {0x555558668870, 0x7fffffffcb40, 0x7fffffffca8f} d = <optimized out> threadData = 0x555555e54260 scopeLevelCounter = {threadData = 0x555555e54260} #17 0x00007ffff5ad04b3 in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at kernel/qcoreapplication.cpp:1462 #18 0x00007ffff5f6d4df in QShortcutMap::dispatchEvent (this=this@entry=0x7fffe80032b8, e=e@entry=0x7fffffffcc20) at kernel/qshortcutmap.cpp:675 d = <optimized out> curKey = <optimized out> current = <optimized out> next = <optimized out> i = <optimized out> enabledShortcuts = 1 ambiguousShortcuts = {d = <optimized out>} se = {<QEvent> = {_vptr.QEvent = 0x7ffff64728d0 <vtable for QShortcutEvent+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7ffff5bae2c0 <_ZL25qt_meta_stringdata_QEvent.lto_priv.0>, data = 0x7ffff5badd00 <_ZL19qt_meta_data_QEvent.lto_priv.0>, static_metacall = 0x0, relatedMetaObjects = 0x0, extradata = 0x0}}, d = 0x0, t = 117, posted = 0, spont = 0, m_accept = 1, reserved = 7866}, sequence = {d = 0x55555768bd40}, ambig = false, sid = -45} #19 0x00007ffff5f6da6f in QShortcutMap::tryShortcut (this=0x7fffe80032b8, e=0x7fffffffcc20) at kernel/qshortcutmap.cpp:343 identicalMatches = 1 d = <optimized out> previousState = QKeySequence::NoMatch #20 0x00007ffff5f20433 in QWindowSystemInterface::handleShortcutEvent (window=0x5555586bfdb0, timestamp=25450092, keyCode=86, modifiers=..., nativeScanCode=55, nativeVirtualKey=118, nativeModifiers=20, text=..., autorepeat=false, count=1) at kernel/qwindowsysteminterface.cpp:477 shortcutMap = @0x7fffe80032b8: {d_ptr = {d = 0x7fffe8005880}} keyEvent = {<QInputEvent> = {<QEvent> = {_vptr.QEvent = 0x7ffff6472c10 <vtable for QKeyEvent+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7ffff5bae2c0 <_ZL25qt_meta_stringdata_QEvent.lto_priv.0>, data = 0x7ffff5badd00 <_ZL19qt_meta_data_QEvent.lto_priv.0>, static_metacall = 0x0, relatedMetaObjects = 0x0, extradata = 0x0}}, d = 0x0, t = 51, posted = 0, spont = 0, m_accept = 0, reserved = 8191}, modState = {i = 67108864}, ts = 0}, txt = {d = 0x55555d0fb670}, k = 86, nScanCode = 55, nVirtualKey = 118, nModifiers = 20, c = 1, autor = 0} #21 0x00007ffff5f3bcf8 in QGuiApplicationPrivate::processKeyEvent (e=0x555557f26fa0) at kernel/qguiapplication.cpp:2398 window = 0x5555586bfdb0 ev = {<QInputEvent> = {<QEvent> = {_vptr.QEvent = 0x55555670f230, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7ffff5bae2c0 <_ZL25qt_meta_stringdata_QEvent.lto_priv.0>, data = 0x7ffff5badd00 <_ZL19qt_meta_data_QEvent.lto_priv.0>, static_metacall = 0x0, relatedMetaObjects = 0x0, extradata = 0x0}}, d = 0x55555670f230, t = 52496, posted = 1, spont = 1, m_accept = 1, reserved = 8191}, modState = {i = 32767}, ts = 140737313434863}, txt = {d = 0x7ffff6485d70 <QWindowSystemInterfacePrivate::windowSystemEventQueue>}, k = 1475506080, nScanCode = 21845, nVirtualKey = 4294954320, nModifiers = 32767, c = 12023, autor = 1} #22 0x00007ffff5f1f5dd in QWindowSystemInterface::sendWindowSystemEvents (flags=flags@entry=...) at kernel/qwindowsysteminterface.cpp:1169 event = 0x555557f26fa0 nevents = 1 #23 0x00007fffef0f4d38 in xcbSourceDispatch (source=<optimized out>) at /usr/src/debug/qt5-base/kde-qtbase/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp:105 xcbEventSource = <optimized out> flags = {i = 36} #24 0x00007ffff3106f8d in g_main_dispatch (context=0x555555e57c70) at ../glib/glib/gmain.c:3565 user_data = 0x0 callback = 0x0 gaig_temp = <optimized out> gaig_temp = <optimized out> cb_data = 0x0 need_destroy = <optimized out> dispatch = 0x7fffef0f4d10 <xcbSourceDispatch(GSource*, GSourceFunc, gpointer)> prev_source = 0x0 was_in_call = 0 cb_funcs = 0x0 begin_time_nsec = 25450093285061 source = 0x555555ec3170 current = 0x555555fe4cb0 i = 1 #25 0x00007ffff3108657 in g_main_context_dispatch_unlocked (context=0x555555e57c70) at ../glib/glib/gmain.c:4425 #26 g_main_context_iterate_unlocked (context=context@entry=0x555555e57c70, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4490 max_priority = 2147483647 timeout_usec = 142000 some_ready = 1 nfds = 5 allocated_nfds = <optimized out> fds = 0x55555682d4e0 begin_time_nsec = <optimized out> #27 0x00007ffff3108865 in g_main_context_iteration (context=0x555555e57c70, may_block=1) at ../glib/glib/gmain.c:4556 retval = <optimized out> #28 0x00007ffff5b21dc9 in QEventDispatcherGlib::processEvents (this=0x555555ec2f90, flags=...) at kernel/qeventdispatcher_glib.cpp:423 d = 0x555555e84930 canWait = <optimized out> savedFlags = {i = 0} result = <optimized out> #29 0x00007ffff5ac893b in QEventLoop::exec (this=0x7fffffffcff0, flags=...) at ../../include/QtCore/../../src/corelib/global/qflags.h:69 d = 0x55555671e060 threadData = <optimized out> locker = {val = 93825001669464} ref = {d = <optimized out>, locker = <optimized out>, exceptionCaught = <optimized out>} app = <optimized out> #30 0x00007ffff5ad4c5b in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1375 threadData = 0x555555e54260 eventLoop = {<QObject> = {_vptr.QObject = 0x7ffff5d3e7a0 <vtable for QEventLoop+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7ffff5bb9b60 <_ZL26qt_meta_stringdata_QObject.lto_priv.0>, data = 0x7ffff5bb9a40 <_ZL20qt_meta_data_QObject.lto_priv.0>, static_metacall = 0x7ffff5b07c30 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}, d_ptr = {d = 0x55555671e060}, static staticQtMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7ffff5bf7240 <_ZL21qt_meta_stringdata_Qt.lto_priv.0>, data = 0x7ffff5bf43c0 <_ZL15qt_meta_data_Qt.lto_priv.0>, static_metacall = 0x0, relatedMetaObjects = 0x0, extradata = 0x0}}}, static staticMetaObject = {d = {superdata = {direct = 0x7ffff5d374e0 <QObject::staticMetaObject>}, stringdata = 0x7ffff5bb5520 <_ZL29qt_meta_stringdata_QEventLoop.lto_priv.0>, data = 0x7ffff5bb54c0 <_ZL23qt_meta_data_QEventLoop.lto_priv.0>, static_metacall = 0x7ffff5ac6710 <QEventLoop::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, extradata = 0x0}}} returnCode = <optimized out> #31 0x000055555555c034 in ??? () #32 0x00007ffff5027635 in __libc_start_call_main (main=main@entry=0x5555555599f0, argc=argc@entry=1, argv=argv@entry=0x7fffffffe728) at ../sysdeps/nptl/libc_start_call_main.h:58 self = <optimized out> result = <optimized out> unwind_buf = {cancel_jmp_buf = {{jmp_buf = {0, -2335179003145522840, 140737488348968, 1, 140737354125312, 93824998684464, -2335179003122454168, -2335165977155505816}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x7fffffffe728}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}} not_first_call = <optimized out> #33 0x00007ffff50276e9 in __libc_start_main_impl (main=0x5555555599f0, argc=1, argv=0x7fffffffe728, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe718) at ../csu/libc-start.c:360 #34 0x000055555555df95 in ??? () ``` I'm not familiar with KDE's clipboard handling, and honestly I'm a bit confused that with anything coming from the clipboard, crashing is a viable option (I would expect clipboard contents to be treated as "external data" and thus potentially problematic, but I'm not familiar with how these things should work), but in the above bug report they seem quite convinced that this is on xfce's side. There is a comment from a contributor that did a change that claimed that fixed the issue but I tested with a nightly build today, which I confirmed in github that had the change and it crashed in the same place: change : https://github.com/KDE/krita/commit/70ef3defac6ef3875e8be74d3956080a281a0666#diff-82e180087239469d005384e8abebc45730c6f584dc8e73faa78bbd4415750e34 link to the code in master now: https://github.com/KDE/krita/blob/master/libs/ui/kis_clipboard.cc#L319 Can anyone confirm if this is in fact an XFCE issue or is on Krita? Please let me know if this information is enough, I ran krita with gdb and allowing gdb to download symbols, but it is not a debug build (is the default arch krita) I do have some experience on linux + debug but I'm not familiar with either krita or xfce (and the possibility of the issue being on the WM is a bit scary). But this to clarify that you can ask me for further details. I opened the issue in xfce4-settings because the last comment on the KDE ticket mentioned that this is solved by downgrading xfce4-settings to a given version, and I couldn't find a better fit for clipboard events on xfce (maybe xfwm4??). I haven't tested myself if downgrading works, but it didn't crash in the past. Feel free to move this to another project if more convenient. Many thanks for XFCE!
issue