[bug] Clearing scratchpad while brush is lagging crashes Krita

Creating a topic on the forum as per guidelines.
When using a performance intensive brush (exaggerated in the video) and drawing in the scratchpad, if the stroke is lagging, clearing the scratchpad will cause Krita to crash to desktop.

My pc specs are pretty decent (ryzen 5 5600), so I assume this is more likely to happen on slower machines or laptops, or when using fancier brushes.

How to reproduce:

  1. Use a performance intensive brush. The brush used in the video has smudging enabled and increasing the brush size makes the stroke lag a bit.
  2. While the stroke is lagging behind, press the button to clear the scratchpad.

Krita 5.2.2-10 (from repository)
Also tested on Krita 5.2.3-Beta1 (from appimage)
Arch Linux 6.6.33-1-lts using xorg

Before reporting the bug on the bug tracker, I will wait to see if people here can reproduce the issue. Since my machine has been a bit iffy lately, I cannot exclude that this is on my end.

Edit: Added backtrace from gdb (please do tell if this is unusable)

Thread 111 "Thread (pooled)" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffefe8866c0 (LWP 10320)]
0x00007ffff5d8986b in qDeleteAll<QList<KUndo2Command*>::const_iterator> (begin=..., end=...) at /usr/include/qt/QtCore/qalgorithms.h:320
320	        delete *begin;
#0  0x00007ffff5d8986b in qDeleteAll<QList<KUndo2Command*>::const_iterator> (begin=..., end=...) at /usr/include/qt/QtCore/qalgorithms.h:320
#1  qDeleteAll<QList<KUndo2Command*> > (c=...) at /usr/include/qt/QtCore/qalgorithms.h:328
#2  KUndo2Command::~KUndo2Command (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/command/kundo2stack.cpp:162
#3  0x00007ffff5d89966 in KUndo2Command::~KUndo2Command (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/command/kundo2stack.cpp:164
#4  0x00007fffa766aee3 in QScopedPointerDeleter<KUndo2Command>::cleanup (pointer=<optimized out>) at /usr/include/qt/QtCore/qscopedpointer.h:104
#5  QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command> >::~QScopedPointer (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qscopedpointer.h:107
#6  KisColorSmudgeInterstrokeData::~KisColorSmudgeInterstrokeData (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/plugins/paintops/colorsmudge/KisColorSmudgeInterstrokeData.cpp:30
#7  0x00007fffa766af45 in KisColorSmudgeInterstrokeData::~KisColorSmudgeInterstrokeData (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/plugins/paintops/colorsmudge/KisColorSmudgeInterstrokeData.cpp:30
#8  0x00007ffff71abf91 in QtSharedPointer::ExternalRefCountData::destroy (this=0x7ffef4002580) at /usr/include/qt/QtCore/qsharedpointer_impl.h:149
#9  QSharedPointer<KisProjectionUpdatesFilter>::deref (dd=0x7ffef4002580) at /usr/include/qt/QtCore/qsharedpointer_impl.h:464
#10 QSharedPointer<KisInterstrokeData>::deref (dd=<optimized out>, dd=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:460
#11 QSharedPointer<KisInterstrokeData>::deref (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:459
#12 QSharedPointer<KisInterstrokeData>::~QSharedPointer (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:316
#13 (anonymous namespace)::BeginInterstrokeDataTransactionCommand::~BeginInterstrokeDataTransactionCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/KisInterstrokeDataTransactionWrapperFactory.cpp:20
#14 (anonymous namespace)::BeginInterstrokeDataTransactionCommand::~BeginInterstrokeDataTransactionCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/KisInterstrokeDataTransactionWrapperFactory.cpp:20
#15 0x00007ffff71af25b in QScopedPointerDeleter<KUndo2Command>::cleanup (pointer=<optimized out>) at /usr/include/qt/QtCore/qscopedpointer.h:104
#16 QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command> >::~QScopedPointer (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qscopedpointer.h:107
#17 OptionalInterstrokeInfo::~OptionalInterstrokeInfo (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/kis_transaction_data.cpp:30
#18 QScopedPointerDeleter<OptionalInterstrokeInfo>::cleanup (pointer=0x7ffef4001960) at /usr/include/qt/QtCore/qscopedpointer.h:60
#19 QScopedPointerDeleter<OptionalInterstrokeInfo>::cleanup (pointer=0x7ffef4001960) at /usr/include/qt/QtCore/qscopedpointer.h:52
#20 QScopedPointer<OptionalInterstrokeInfo, QScopedPointerDeleter<OptionalInterstrokeInfo> >::~QScopedPointer (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qscopedpointer.h:107
#21 KisTransactionData::Private::~Private (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/kis_transaction_data.cpp:37
#22 KisTransactionData::~KisTransactionData (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/kis_transaction_data.cpp:120
#23 0x00007ffff71af3d6 in KisTransactionData::~KisTransactionData (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/image/kis_transaction_data.cpp:121
#24 0x00007ffff5d899ce in qDeleteAll<QTypedArrayData<KUndo2Command*>::const_iterator> (begin=..., end=...) at /usr/include/qt/QtCore/qalgorithms.h:320
#25 qDeleteAll<QVector<KUndo2Command*> > (c=...) at /usr/include/qt/QtCore/qalgorithms.h:328
#26 KisCommandUtils::CompositeCommand::~CompositeCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/command/kis_command_utils.cpp:177
#27 0x00007ffff5d89a36 in KisCommandUtils::CompositeCommand::~CompositeCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/command/kis_command_utils.cpp:178
#28 0x00007ffff5d8986e in qDeleteAll<QList<KUndo2Command*>::const_iterator> (begin=..., end=...) at /usr/include/qt/QtCore/qalgorithms.h:320
#29 qDeleteAll<QList<KUndo2Command*> > (c=...) at /usr/include/qt/QtCore/qalgorithms.h:328
#30 KUndo2Command::~KUndo2Command (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/command/kundo2stack.cpp:162
#31 0x00007ffff7922519 in (anonymous namespace)::MergeableStrokeUndoCommand::~MergeableStrokeUndoCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/ui/tool/strokes/kis_painter_based_stroke_strategy.cpp:357
#32 (anonymous namespace)::MergeableStrokeUndoCommand::~MergeableStrokeUndoCommand (this=<optimized out>, this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/ui/tool/strokes/kis_painter_based_stroke_strategy.cpp:357
#33 0x00007ffff7733cba in QtSharedPointer::ExternalRefCountData::destroy (this=0x7ffef48976a0) at /usr/include/qt/QtCore/qsharedpointer_impl.h:149
#34 QSharedPointer<KoID::KoIDPrivate>::deref(QtSharedPointer::ExternalRefCountData*) [clone .part.0] [clone .lto_priv.0] [clone .lto_priv.0] (dd=0x7ffef48976a0) at /usr/include/qt/QtCore/qsharedpointer_impl.h:464
#35 0x00007ffff7922b15 in QSharedPointer<KUndo2Command>::deref (dd=<optimized out>, dd=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:460
#36 QSharedPointer<KUndo2Command>::deref (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:459
#37 QSharedPointer<KUndo2Command>::~QSharedPointer (this=<optimized out>, this=<optimized out>) at /usr/include/qt/QtCore/qsharedpointer_impl.h:316
#38 KisPainterBasedStrokeStrategy::finishStrokeCallback (this=<optimized out>) at /usr/src/debug/krita/krita-5.2.2/libs/ui/tool/strokes/kis_painter_based_stroke_strategy.cpp:469
#39 0x00007ffff6fae6a3 in KisUpdateJobItem::runImpl (this=0x5555591a2c80) at /usr/src/debug/krita/build/libs/image/kritaimage_autogen/EWIEGA46WW/../../../../../krita-5.2.2/libs/image/kis_update_job_item.h:100
#40 KisUpdateJobItem::run (this=0x5555591a2c80) at /usr/src/debug/krita/build/libs/image/kritaimage_autogen/EWIEGA46WW/../../../../../krita-5.2.2/libs/image/kis_update_job_item.h:49
#41 0x00007ffff58f3945 in QThreadPoolThread::run (this=0x555561c45790) at thread/qthreadpool.cpp:100
#42 0x00007ffff58f261b in operator() (__closure=<optimized out>) at thread/qthread_unix.cpp:350
#43 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=...) at thread/qthread_unix.cpp:287
#44 QThreadPrivate::start (arg=0x555561c45790) at thread/qthread_unix.cpp:310
#45 0x00007ffff52a6ded in start_thread (arg=<optimized out>) at pthread_create.c:447
#46 0x00007ffff532a0dc in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

Reported on the bug tracker:
https://bugs.kde.org/show_bug.cgi?id=488800

I am on linux.
Pop os, gtx 1060 6gb, Krita version 5.2.2

I could not get it to crash, it might crash on windows though.
edit: Also tested it on 5.2.3-Beta1, still no crash.

I can reproduce this on 5.3.0-prealpha-af99e90fa8, though it doesn’t always happen. The first time I tried clearing the scratchpad while a color smudge brushstroke lagged, it crashed immediately- but the next time it took several tries to crash.

Backtrace
Thread 24 Crashed:: Thread (pooled)
0   libkritacommand.20.0.0.dylib  	       0x104fbdd7c void qDeleteAll<QList<KUndo2Command*>::const_iterator>(QList<KUndo2Command*>::const_iterator, QList<KUndo2Command*>::const_iterator) + 36 (qalgorithms.h:320) [inlined]
1   libkritacommand.20.0.0.dylib  	       0x104fbdd7c void qDeleteAll<QList<KUndo2Command*>>(QList<KUndo2Command*> const&) + 64 (qalgorithms.h:328) [inlined]
2   libkritacommand.20.0.0.dylib  	       0x104fbdd7c KUndo2Command::~KUndo2Command() + 100 (kundo2stack.cpp:162)
3   libkritacommand.20.0.0.dylib  	       0x104fbddfc KUndo2Command::~KUndo2Command() + 4 (kundo2stack.cpp:161) [inlined]
4   libkritacommand.20.0.0.dylib  	       0x104fbddfc KUndo2Command::~KUndo2Command() + 12 (kundo2stack.cpp:161)
5   kritacolorsmudgepaintop.so    	       0x135c32604 QScopedPointerDeleter<KUndo2Command>::cleanup(KUndo2Command*) + 16 (qscopedpointer.h:60) [inlined]
6   kritacolorsmudgepaintop.so    	       0x135c32604 QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command>>::~QScopedPointer() + 20 (qscopedpointer.h:107) [inlined]
7   kritacolorsmudgepaintop.so    	       0x135c32604 QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command>>::~QScopedPointer() + 20 (qscopedpointer.h:105) [inlined]
8   kritacolorsmudgepaintop.so    	       0x135c32604 KisColorSmudgeInterstrokeData::~KisColorSmudgeInterstrokeData() + 108 (KisColorSmudgeInterstrokeData.cpp:30)
9   kritacolorsmudgepaintop.so    	       0x135c326a8 KisColorSmudgeInterstrokeData::~KisColorSmudgeInterstrokeData() + 4 (KisColorSmudgeInterstrokeData.cpp:26) [inlined]
10  kritacolorsmudgepaintop.so    	       0x135c326a8 KisColorSmudgeInterstrokeData::~KisColorSmudgeInterstrokeData() + 12 (KisColorSmudgeInterstrokeData.cpp:26)
11  libkritaimage.20.0.0.dylib    	       0x1070bbde4 QtSharedPointer::ExternalRefCountData::destroy() + 12 (qsharedpointer_impl.h:149) [inlined]
12  libkritaimage.20.0.0.dylib    	       0x1070bbde4 QSharedPointer<KisInterstrokeData>::deref(QtSharedPointer::ExternalRefCountData*) + 36 (qsharedpointer_impl.h:455) [inlined]
13  libkritaimage.20.0.0.dylib    	       0x1070bbde4 QSharedPointer<KisInterstrokeData>::deref() + 40 (qsharedpointer_impl.h:450) [inlined]
14  libkritaimage.20.0.0.dylib    	       0x1070bbde4 QSharedPointer<KisInterstrokeData>::~QSharedPointer() + 40 (qsharedpointer_impl.h:307) [inlined]
15  libkritaimage.20.0.0.dylib    	       0x1070bbde4 QSharedPointer<KisInterstrokeData>::~QSharedPointer() + 40 (qsharedpointer_impl.h:307) [inlined]
16  libkritaimage.20.0.0.dylib    	       0x1070bbde4 (anonymous namespace)::BeginInterstrokeDataTransactionCommand::~BeginInterstrokeDataTransactionCommand() + 72 (KisInterstrokeDataTransactionWrapperFactory.cpp:20) [inlined]
17  libkritaimage.20.0.0.dylib    	       0x1070bbde4 (anonymous namespace)::BeginInterstrokeDataTransactionCommand::~BeginInterstrokeDataTransactionCommand() + 72 (KisInterstrokeDataTransactionWrapperFactory.cpp:20) [inlined]
18  libkritaimage.20.0.0.dylib    	       0x1070bbde4 (anonymous namespace)::BeginInterstrokeDataTransactionCommand::~BeginInterstrokeDataTransactionCommand() + 92 (KisInterstrokeDataTransactionWrapperFactory.cpp:20)
19  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointerDeleter<KUndo2Command>::cleanup(KUndo2Command*) + 16 (qscopedpointer.h:60) [inlined]
20  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command>>::~QScopedPointer() + 20 (qscopedpointer.h:107) [inlined]
21  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointer<KUndo2Command, QScopedPointerDeleter<KUndo2Command>>::~QScopedPointer() + 20 (qscopedpointer.h:105) [inlined]
22  libkritaimage.20.0.0.dylib    	       0x1070bafb4 OptionalInterstrokeInfo::~OptionalInterstrokeInfo() + 40 (kis_transaction_data.cpp:30) [inlined]
23  libkritaimage.20.0.0.dylib    	       0x1070bafb4 OptionalInterstrokeInfo::~OptionalInterstrokeInfo() + 40 (kis_transaction_data.cpp:30) [inlined]
24  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointerDeleter<OptionalInterstrokeInfo>::cleanup(OptionalInterstrokeInfo*) + 44 (qscopedpointer.h:60) [inlined]
25  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointer<OptionalInterstrokeInfo, QScopedPointerDeleter<OptionalInterstrokeInfo>>::~QScopedPointer() + 48 (qscopedpointer.h:107) [inlined]
26  libkritaimage.20.0.0.dylib    	       0x1070bafb4 QScopedPointer<OptionalInterstrokeInfo, QScopedPointerDeleter<OptionalInterstrokeInfo>>::~QScopedPointer() + 48 (qscopedpointer.h:105) [inlined]
27  libkritaimage.20.0.0.dylib    	       0x1070bafb4 KisTransactionData::Private::~Private() + 64 (kis_transaction_data.cpp:37)
28  libkritaimage.20.0.0.dylib    	       0x1070b9ad4 KisTransactionData::Private::~Private() + 4 (kis_transaction_data.cpp:37) [inlined]
29  libkritaimage.20.0.0.dylib    	       0x1070b9ad4 KisTransactionData::~KisTransactionData() + 140 (kis_transaction_data.cpp:120)
30  libkritaimage.20.0.0.dylib    	       0x1070b9bdc KisTransactionData::~KisTransactionData() + 4 (kis_transaction_data.cpp:116) [inlined]
31  libkritaimage.20.0.0.dylib    	       0x1070b9bdc KisTransactionData::~KisTransactionData() + 12 (kis_transaction_data.cpp:116)
32  libkritacommand.20.0.0.dylib  	       0x104fc4f70 void qDeleteAll<QTypedArrayData<KUndo2Command*>::const_iterator>(QTypedArrayData<KUndo2Command*>::const_iterator, QTypedArrayData<KUndo2Command*>::const_iterator) + 40 (qalgorithms.h:320) [inlined]
33  libkritacommand.20.0.0.dylib  	       0x104fc4f70 void qDeleteAll<QVector<KUndo2Command*>>(QVector<KUndo2Command*> const&) + 60 (qalgorithms.h:328) [inlined]
34  libkritacommand.20.0.0.dylib  	       0x104fc4f70 KisCommandUtils::CompositeCommand::~CompositeCommand() + 72 (kis_command_utils.cpp:177) [inlined]
35  libkritacommand.20.0.0.dylib  	       0x104fc4f70 KisCommandUtils::CompositeCommand::~CompositeCommand() + 72 (kis_command_utils.cpp:176) [inlined]
36  libkritacommand.20.0.0.dylib  	       0x104fc4f70 KisCommandUtils::CompositeCommand::~CompositeCommand() + 92 (kis_command_utils.cpp:176)
37  libkritacommand.20.0.0.dylib  	       0x104fbdd84 void qDeleteAll<QList<KUndo2Command*>::const_iterator>(QList<KUndo2Command*>::const_iterator, QList<KUndo2Command*>::const_iterator) + 44 (qalgorithms.h:320) [inlined]
38  libkritacommand.20.0.0.dylib  	       0x104fbdd84 void qDeleteAll<QList<KUndo2Command*>>(QList<KUndo2Command*> const&) + 72 (qalgorithms.h:328) [inlined]
39  libkritacommand.20.0.0.dylib  	       0x104fbdd84 KUndo2Command::~KUndo2Command() + 108 (kundo2stack.cpp:162)
40  libkritaui.20.0.0.dylib       	       0x105a9faa8 (anonymous namespace)::MergeableStrokeUndoCommand::~MergeableStrokeUndoCommand() + 24 (kis_painter_based_stroke_strategy.cpp:357) [inlined]
41  libkritaui.20.0.0.dylib       	       0x105a9faa8 (anonymous namespace)::MergeableStrokeUndoCommand::~MergeableStrokeUndoCommand() + 24 (kis_painter_based_stroke_strategy.cpp:357) [inlined]
42  libkritaui.20.0.0.dylib       	       0x105a9faa8 (anonymous namespace)::MergeableStrokeUndoCommand::~MergeableStrokeUndoCommand() + 40 (kis_painter_based_stroke_strategy.cpp:357)
43  libkritaui.20.0.0.dylib       	       0x105a9edfc QtSharedPointer::ExternalRefCountData::destroy() + 12 (qsharedpointer_impl.h:149) [inlined]
44  libkritaui.20.0.0.dylib       	       0x105a9edfc QSharedPointer<KUndo2Command>::deref(QtSharedPointer::ExternalRefCountData*) + 36 (qsharedpointer_impl.h:455) [inlined]
45  libkritaui.20.0.0.dylib       	       0x105a9edfc QSharedPointer<KUndo2Command>::deref() + 40 (qsharedpointer_impl.h:450) [inlined]
46  libkritaui.20.0.0.dylib       	       0x105a9edfc QSharedPointer<KUndo2Command>::~QSharedPointer() + 40 (qsharedpointer_impl.h:307) [inlined]
47  libkritaui.20.0.0.dylib       	       0x105a9edfc QSharedPointer<KUndo2Command>::~QSharedPointer() + 40 (qsharedpointer_impl.h:307) [inlined]
48  libkritaui.20.0.0.dylib       	       0x105a9edfc KisPainterBasedStrokeStrategy::finishStrokeCallback() + 2380 (kis_painter_based_stroke_strategy.cpp:469)
49  libkritaimage.20.0.0.dylib    	       0x106db815c KisUpdateJobItem::runImpl() + 300 (kis_update_job_item.h:100) [inlined]
50  libkritaimage.20.0.0.dylib    	       0x106db815c KisUpdateJobItem::run() + 336 (kis_update_job_item.h:49)
51  QtCore                        	       0x1090beea4 0x109098000 + 159396
52  QtCore                        	       0x1090bab08 0x109098000 + 142088
53  libsystem_pthread.dylib       	       0x180ec6f94 _pthread_start + 136
54  libsystem_pthread.dylib       	       0x180ec1d34 thread_start + 8