Skip to content

ScreenWindow::updateCurrentLine: Better bound currentLine

Méven Car requested to merge work/meven/fix-crash-splitting into master

Fixes crash, obtained in wayland when splitting the terminal (Ctrl+( or Ctrl+))

While debugging I could see lineCount was 26 and windowLines 82, making _currentLine = qBound(0, _currentLine, lineCount() - windowLines());

Which ends up calling qBound(0, _currentLine, -56); and thus hitting a qt_assert:

Thread 1 "konsole" received signal SIGABRT, Aborted.
__pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
Download failed: Argument invalide.  Continuing without source file ./nptl/./nptl/pthread_kill.c.                                                                                                                                                                                                                                                               
44      ./nptl/pthread_kill.c: Aucun fichier ou dossier de ce type.
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff543c406 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff542287c in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff5cb822c in qAbort () at /home/meven/kde6/src/qtbase/src/corelib/global/qglobal.cpp:161
#6  0x00007ffff5cb8b77 in qt_message_fatal (message=<synthetic pointer>..., context=...) at /home/meven/kde6/src/qtbase/src/corelib/global/qlogging.cpp:2059
#7  QMessageLogger::fatal (this=this@entry=0x7fffffffbc68, msg=msg@entry=0x7ffff6058d98 "ASSERT: \"%s\" in file %s, line %d") at /home/meven/kde6/src/qtbase/src/corelib/global/qlogging.cpp:939
#8  0x00007ffff5cb817e in qt_assert (assertion=<optimized out>, file=<optimized out>, line=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/global/qassert.cpp:68
#9  0x00007ffff7ad6e5a in qBound<int> (min=@0x7fffffffbce0: 0, val=@0x555555f89cfc: 0, max=@0x7fffffffbce4: -56) at /home/meven/kde6/qt6/include/QtCore/qminmax.h:46
#10 0x00007ffff7b10a87 in Konsole::ScreenWindow::updateCurrentLine (this=0x555555f89cd0) at /home/meven/kde6/src/konsole/src/ScreenWindow.cpp:327
#11 0x00007ffff7bd5e14 in Konsole::TerminalDisplay::updateImage (this=0x555555eeb350) at /home/meven/kde6/src/konsole/src/terminalDisplay/TerminalDisplay.cpp:460
#12 0x00007ffff7bf0212 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (Konsole::TerminalDisplay::*)()>::call(void (Konsole::TerminalDisplay::*)(), Konsole::TerminalDisplay*, void**) (f=(void (Konsole::TerminalDisplay::*)(Konsole::TerminalDisplay * const)) 0x7ffff7bd5db2 <Konsole::TerminalDisplay::updateImage()>, 
    o=0x555555eeb350, arg=0x7fffffffbf98) at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:145
#13 0x00007ffff7bef93a in QtPrivate::FunctionPointer<void (Konsole::TerminalDisplay::*)()>::call<QtPrivate::List<>, void>(void (Konsole::TerminalDisplay::*)(), Konsole::TerminalDisplay*, void**) (f=(void (Konsole::TerminalDisplay::*)(Konsole::TerminalDisplay * const)) 0x7ffff7bd5db2 <Konsole::TerminalDisplay::updateImage()>, o=0x555555eeb350, 
    arg=0x7fffffffbf98) at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:182
#14 0x00007ffff7bee7d7 in QtPrivate::QCallableObject<void (Konsole::TerminalDisplay::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x555555f8dbb0, r=0x555555eeb350, a=0x7fffffffbf98, ret=0x0) at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:485
#15 0x00007ffff5dc644e in QtPrivate::QSlotObjectBase::call (a=0x7fffffffbf98, r=0x555555eeb350, this=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobjectdefs_impl.h:433
#16 doActivate<false> (sender=0x555555f89cd0, signal_index=3, argv=0x7fffffffbf98) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:4021
#17 0x00007ffff7b1106b in Konsole::ScreenWindow::outputChanged (this=0x555555f89cd0) at /home/meven/kde6/build/konsole/src/konsoleprivate_autogen/include/moc_ScreenWindow.cpp:241
#18 0x00007ffff7b10bea in Konsole::ScreenWindow::notifyOutputChanged (this=0x555555f89cd0) at /home/meven/kde6/src/konsole/src/ScreenWindow.cpp:352
#19 0x00007ffff7be16d7 in Konsole::TerminalDisplay::setSelectMode (this=0x555555eeb350, mode=false) at /home/meven/kde6/src/konsole/src/terminalDisplay/TerminalDisplay.cpp:2599
#20 0x00007ffff7c492ab in Konsole::SessionController::setSelectMode (this=0x555555f125d0, mode=false) at /home/meven/kde6/src/konsole/src/session/SessionController.cpp:1299
#21 0x00007ffff7bd8eba in Konsole::TerminalDisplay::updateImageSize (this=0x555555eeb350) at /home/meven/kde6/src/konsole/src/terminalDisplay/TerminalDisplay.cpp:983
#22 0x00007ffff7bd8c50 in Konsole::TerminalDisplay::resizeEvent (this=0x555555eeb350, event=0x7fffffffc3f0) at /home/meven/kde6/src/konsole/src/terminalDisplay/TerminalDisplay.cpp:944
#23 0x00007ffff6fe156b in QWidget::event (this=0x555555eeb350, event=0x7fffffffc3f0) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qwidget.cpp:9149
#24 0x00007ffff7be3268 in Konsole::TerminalDisplay::event (this=0x555555eeb350, event=0x7fffffffc3f0) at /home/meven/kde6/src/konsole/src/terminalDisplay/TerminalDisplay.cpp:2927
#25 0x00007ffff6f88b55 in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x555555eeb350, e=0x7fffffffc3f0) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qapplication.cpp:3287
#26 0x00007ffff5d65a08 in QCoreApplication::notifyInternal2 (receiver=0x555555eeb350, event=0x7fffffffc3f0) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1118
#27 0x00007ffff5d65bbd in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1536
#28 0x00007ffff6fd75d8 in QWidgetPrivate::setGeometry_sys (this=this@entry=0x555555eeb7e0, x=1110, y=0, w=<optimized out>, h=1440, isMove=<optimized out>, isMove@entry=true) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qwidget.cpp:7404
#29 0x00007ffff6fd85d1 in QWidget::setGeometry (this=this@entry=0x555555eeb350, r=...) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qwidget.cpp:7292
#30 0x00007ffff718b297 in QSplitterPrivate::setGeo (this=this@entry=0x5555559b8930, sls=sls@entry=0x555555f0cdf0, p=1110, s=s@entry=1386, allowCollapse=allowCollapse@entry=false) at /home/meven/kde6/src/qtbase/src/widgets/widgets/qsplitter.cpp:741
#31 0x00007ffff718ceb2 in QSplitterPrivate::doResize (this=this@entry=0x5555559b8930) at /home/meven/kde6/src/qtbase/src/widgets/widgets/qsplitter.cpp:529
#32 0x00007ffff718d71f in QSplitterPrivate::recalc (this=this@entry=0x5555559b8930, update=<optimized out>) at /home/meven/kde6/src/qtbase/src/widgets/widgets/qsplitter.cpp:443
#33 0x00007ffff718da04 in QSplitterPrivate::insertWidget_helper (this=0x5555559b8930, index=1, widget=0x555555eeb350, show=<optimized out>) at /home/meven/kde6/src/qtbase/src/widgets/widgets/qsplitter.cpp:816
#34 0x00007ffff7c81ab0 in Konsole::ViewSplitter::addTerminalDisplay (this=0x555555ce65e0, terminalDisplay=0x555555eeb350, containerOrientation=Qt::Horizontal, behavior=Konsole::ViewSplitter::AddBehavior::AddAfter) at /home/meven/kde6/src/konsole/src/widgets/ViewSplitter.cpp:110
#35 0x00007ffff7c783f0 in Konsole::TabbedViewContainer::splitView (this=0x555555628410, view=0x555555eeb350, orientation=Qt::Horizontal) at /home/meven/kde6/src/konsole/src/widgets/ViewContainer.cpp:345
#36 0x00007ffff7b1cde0 in Konsole::ViewManager::splitView (this=0x5555557ecef0, orientation=Qt::Horizontal, fromNextTab=false) at /home/meven/kde6/src/konsole/src/ViewManager.cpp:764
#37 0x00007ffff7b1ca9e in Konsole::ViewManager::splitLeftRight (this=0x5555557ecef0) at /home/meven/kde6/src/konsole/src/ViewManager.cpp:700
#38 0x00007ffff7b31f9b in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (Konsole::ViewManager::*)()>::call(void (Konsole::ViewManager::*)(), Konsole::ViewManager*, void**) (f=(void (Konsole::ViewManager::*)(Konsole::ViewManager * const)) 0x7ffff7b1ca78 <Konsole::ViewManager::splitLeftRight()>, o=0x5555557ecef0, 
    arg=0x7fffffffca00) at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:145
#39 0x00007ffff7b30458 in QtPrivate::FunctionPointer<void (Konsole::ViewManager::*)()>::call<QtPrivate::List<>, void>(void (Konsole::ViewManager::*)(), Konsole::ViewManager*, void**) (f=(void (Konsole::ViewManager::*)(Konsole::ViewManager * const)) 0x7ffff7b1ca78 <Konsole::ViewManager::splitLeftRight()>, o=0x5555557ecef0, arg=0x7fffffffca00)
    at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:182
#40 0x00007ffff7b2d7b3 in QtPrivate::QCallableObject<void (Konsole::ViewManager::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x5555557f0bc0, r=0x5555557ecef0, a=0x7fffffffca00, ret=0x0) at /home/meven/kde6/qt6/include/QtCore/qobjectdefs_impl.h:485
#41 0x00007ffff5dc644e in QtPrivate::QSlotObjectBase::call (a=0x7fffffffca00, r=0x5555557ecef0, this=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobjectdefs_impl.h:433
#42 doActivate<false> (sender=0x5555557f09f0, signal_index=7, argv=0x7fffffffca00) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:4021
#43 0x00007ffff5dbe437 in QMetaObject::activate (sender=sender@entry=0x5555557f09f0, m=m@entry=0x7ffff6cb0f60 <QAction::staticMetaObject>, local_signal_index=local_signal_index@entry=4, argv=argv@entry=0x7fffffffca00) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:4081
#44 0x00007ffff69bcc16 in QAction::triggered (this=this@entry=0x5555557f09f0, _t1=<optimized out>) at /home/meven/kde6/build/qtbase/src/gui/Gui_autogen/include/moc_qaction.cpp:642
#45 0x00007ffff69bfadd in QAction::activate (this=0x5555557f09f0, event=<optimized out>) at /home/meven/kde6/src/qtbase/src/gui/kernel/qaction.cpp:1102
#46 0x00007ffff69c0b28 in QAction::event (e=0x7fffffffcc30, this=0x5555557f09f0) at /home/meven/kde6/src/qtbase/src/gui/kernel/qaction.cpp:1044
#47 QAction::event (this=0x5555557f09f0, e=0x7fffffffcc30) at /home/meven/kde6/src/qtbase/src/gui/kernel/qaction.cpp:1027
#48 0x00007ffff6f88b55 in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x5555557f09f0, e=0x7fffffffcc30) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qapplication.cpp:3287
#49 0x00007ffff5d65a08 in QCoreApplication::notifyInternal2 (receiver=0x5555557f09f0, event=0x7fffffffcc30) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1118
#50 0x00007ffff5d65bbd in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1536
#51 0x00007ffff69d1cd3 in QShortcutMap::dispatchEvent (this=<optimized out>, e=<optimized out>) at /home/meven/kde6/src/qtbase/src/gui/kernel/qshortcutmap.cpp:636
#52 0x00007ffff69d2a4b in QShortcutMap::tryShortcut (this=this@entry=0x555555590ff8, e=e@entry=0x7fffffffcd10) at /home/meven/kde6/src/qtbase/src/gui/kernel/qshortcutmap.cpp:310
#53 0x00007ffff662e16c in QWindowSystemInterface::handleShortcutEvent (window=<optimized out>, window@entry=0x55555589ab10, timestamp=<optimized out>, keyCode=202, modifiers=..., nativeScanCode=13, nativeVirtualKey=40, nativeModifiers=4, text=..., autorepeat=false, count=1) at /home/meven/kde6/src/qtbase/src/gui/kernel/qwindowsysteminterface.cpp:449
#54 0x00007ffff65c8efa in QGuiApplicationPrivate::processKeyEvent (e=0x7fffffffcf20) at /home/meven/kde6/src/qtbase/src/gui/kernel/qguiapplication.cpp:2410
#55 0x00007fffef48f179 in QIBusPlatformInputContext::filterEventFinished (this=<optimized out>, call=0x555555eaba80) at /home/meven/kde6/src/qtbase/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp:507
#56 0x00007ffff5dc644e in QtPrivate::QSlotObjectBase::call (a=0x7fffffffd0f0, r=0x5555555c8350, this=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobjectdefs_impl.h:433
#57 doActivate<false> (sender=0x555555eaba80, signal_index=3, argv=0x7fffffffd0f0) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:4021
#58 0x00007ffff5dbe437 in QMetaObject::activate (sender=<optimized out>, m=m@entry=0x7ffff4249540 <QDBusPendingCallWatcher::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7fffffffd0f0) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:4081
#59 0x00007ffff4215283 in QDBusPendingCallWatcher::finished (this=<optimized out>, _t1=<optimized out>) at /home/meven/kde6/build/qtbase/src/dbus/DBus_autogen/include/moc_qdbuspendingcall.cpp:200
#60 0x00007ffff5db6ca0 in QObject::event (this=0x555555eaba80, e=0x7fffe0001920) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qobject.cpp:1437
#61 0x00007ffff6f88b55 in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x555555eaba80, e=0x7fffe0001920) at /home/meven/kde6/src/qtbase/src/widgets/kernel/qapplication.cpp:3287
#62 0x00007ffff5d65a08 in QCoreApplication::notifyInternal2 (receiver=0x555555eaba80, event=0x7fffe0001920) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1118
#63 0x00007ffff5d65bbd in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1536
#64 0x00007ffff5d69400 in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x5555555944f0) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1898
#65 0x00007ffff5d6970c in QCoreApplication::sendPostedEvents (receiver=<optimized out>, event_type=<optimized out>) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qcoreapplication.cpp:1757
#66 0x00007ffff6021347 in postEventSourceDispatch (s=0x5555555bd2f0) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:243
#67 0x00007ffff3d6a49d in g_main_dispatch (context=0x7fffe8000f10) at ../../../glib/gmain.c:3460
#68 g_main_context_dispatch (context=0x7fffe8000f10) at ../../../glib/gmain.c:4200
#69 0x00007ffff3dc5178 in g_main_context_iterate.constprop.0 (context=0x7fffe8000f10, block=<optimized out>, dispatch=1, self=<optimized out>) at ../../../glib/gmain.c:4276
#70 0x00007ffff3d691b0 in g_main_context_iteration (context=0x7fffe8000f10, may_block=1) at ../../../glib/gmain.c:4343
#71 0x00007ffff6020cf0 in QEventDispatcherGlib::processEvents (this=0x555555599130, flags=...) at /home/meven/kde6/src/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:393
#72 0x00007ffff5d71e8b in QEventLoop::exec (this=this@entry=0x7fffffffd4e0, flags=..., flags@entry=...) at /home/meven/kde6/src/qtbase/src/corelib/global/qflags.h:34
#73 0x00007ffff5d6e3ec in QCoreApplication::exec () at /home/meven/kde6/src/qtbase/src/corelib/global/qflags.h:74
#74 0x00005555555596a0 in main (argc=1, argv=0x7fffffffd8a8) at /home/meven/kde6/src/konsole/src/main.cpp:271

Merge request reports