Bug 459520

Summary: Crash in the new diffview
Product: [Applications] kate Reporter: Eric Armbruster <eric1>
Component: generalAssignee: KWrite Developers <kwrite-bugs-null>
Status: RESOLVED FIXED    
Severity: crash CC: christoph
Priority: NOR    
Version First Reported In: Git   
Target Milestone: ---   
Platform: Other   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:

Description Eric Armbruster 2022-09-22 12:30:31 UTC
#0  0x0000703395ea149c in ?? () from /usr/lib/libc.so.6
#1  0x0000703395e51958 in raise () from /usr/lib/libc.so.6
#2  0x00007033996b7af5 in KCrash::defaultCrashHandler (sig=11) at /home/eric/kde/src/kcrash/src/kcrash.cpp:633
#3  <signal handler called>
#4  0x0000703396c31b26 in QTextBlock::setUserData(QTextBlockUserData*) () from /usr/lib/libQt5Gui.so.5
#5  0x000070339957e09d in DiffSyntaxHighlighter::highlightBlock (this=0x623870e46aa0, text="@@ 1692,7 public:") at /home/eric/kde/src/kate/apps/lib/diff/diffeditor.cpp:46
#6  0x0000703396c974d7 in ?? () from /usr/lib/libQt5Gui.so.5
#7  0x0000703396c98532 in QSyntaxHighlighter::rehighlight() () from /usr/lib/libQt5Gui.so.5
#8  0x000070339806f7a3 in KSyntaxHighlighting::SyntaxHighlighter::setDefinition (this=0x623870e46aa0, def=...) at /home/eric/kde/src/syntax-highlighting/src/lib/syntaxhighlighter.cpp:74
#9  0x0000703399570ffd in DiffWidget::parseAndShowDiff (this=0x62386fc41880, 
    raw="diff --git a/addons/lspclient/lspclientpluginview.cpp b/addons/lspclient/lspclientpluginview.cpp\nindex fadd869f3..4425c162f 100644\n--- a/addons/lspclient/lspclientpluginview.cpp\n+++ b/addons/lspclient"... = {...}) at /home/eric/kde/src/kate/apps/lib/diff/diffwidget.cpp:599
#10 0x000070339956dd6c in DiffWidget::openDiff (this=0x62386fc41880, 
    raw="diff --git a/addons/lspclient/lspclientpluginview.cpp b/addons/lspclient/lspclientpluginview.cpp\nindex fadd869f3..4425c162f 100644\n--- a/addons/lspclient/lspclientpluginview.cpp\n+++ b/addons/lspclient"... = {...}) at /home/eric/kde/src/kate/apps/lib/diff/diffwidget.cpp:771
#11 0x00007033994dfe30 in KateMainWindow::showDiff (this=0x62386f8adec0, 
    wordDiff="diff --git a/addons/lspclient/lspclientpluginview.cpp b/addons/lspclient/lspclientpluginview.cpp\nindex fadd869f3..4425c162f 100644\n--- a/addons/lspclient/lspclientpluginview.cpp\n+++ b/addons/lspclient"... = {...}, params=...) at /home/eric/kde/src/kate/apps/lib/katemainwindow.cpp:1356
#12 0x000070339956b9b5 in Utils::showDiff (
    diff="diff --git a/addons/lspclient/lspclientpluginview.cpp b/addons/lspclient/lspclientpluginview.cpp\nindex fadd869f3..4425c162f 100644\n--- a/addons/lspclient/lspclientpluginview.cpp\n+++ b/addons/lspclient"... = {...}, params=..., mainWindow=0x62386f8a8b50) at /home/eric/kde/src/kate/apps/lib/ktexteditor_utils.cpp:164
#13 0x0000703368393b17 in GitWidget::showDiff(QString const&, bool)::$_59::operator()(int, QProcess::ExitStatus) const (this=0x62386fc41740, exitCode=0, es=QProcess::NormalExit)
    at /home/eric/kde/src/kate/addons/project/gitwidget.cpp:653
#14 0x0000703368393876 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<int, QProcess::ExitStatus>, void, GitWidget::showDiff(QString const&, bool)::$_59>::call(GitWidget::showDiff(QString const&, bool)::$_59&, void**) (f=..., arg=0x7ffe28d0df00) at /usr/include/qt/QtCore/qobjectdefs_impl.h:146
#15 0x0000703368393831 in QtPrivate::Functor<GitWidget::showDiff(QString const&, bool)::$_59, 2>::call<QtPrivate::List<int, QProcess::ExitStatus>, void>(GitWidget::showDiff(QString const&, bool)::$_59&, void*, void**) (f=..., arg=0x7ffe28d0df00) at /usr/include/qt/QtCore/qobjectdefs_impl.h:256
#16 0x00007033683937c1 in QtPrivate::QFunctorSlotObject<GitWidget::showDiff(QString const&, bool)::$_59, 2, QtPrivate::List<int, QProcess::ExitStatus>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x62386fc41730, r=0x62386fc22970, a=0x7ffe28d0df00, ret=0x0) at /usr/include/qt/QtCore/qobjectdefs_impl.h:443
#17 0x00007033966bd381 in ?? () from /usr/lib/libQt5Core.so.5
#18 0x000070339661810d in QProcess::finished(int, QProcess::ExitStatus) () from /usr/lib/libQt5Core.so.5
#19 0x0000703396614912 in ?? () from /usr/lib/libQt5Core.so.5
#20 0x000070339661899e in ?? () from /usr/lib/libQt5Core.so.5
#21 0x00007033966bd530 in ?? () from /usr/lib/libQt5Core.so.5
#22 0x00007033966bf234 in QSocketNotifier::activated(QSocketDescriptor, QSocketNotifier::Type, QSocketNotifier::QPrivateSignal) () from /usr/lib/libQt5Core.so.5
#23 0x00007033966bf378 in QSocketNotifier::event(QEvent*) () from /usr/lib/libQt5Core.so.5
#24 0x0000703397378b1c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/libQt5Widgets.so.5
#25 0x000070339668cb88 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/libQt5Core.so.5
#26 0x00007033966d6366 in ?? () from /usr/lib/libQt5Core.so.5
#27 0x000070339491ab2b in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#28 0x0000703394970e79 in ?? () from /usr/lib/libglib-2.0.so.0
#29 0x0000703394918252 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#30 0x00007033966d750c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQt5Core.so.5


STEPS TO REPRODUCE
1. I think this crash happened when opening a diff view
2. So far only happened once and I have been using the new view extensively in the last days :)

OBSERVED RESULT


EXPECTED RESULT


SOFTWARE/OS VERSIONS
Windows: 
macOS: 
Linux/KDE Plasma: 
(available in About System)
KDE Plasma Version: 
KDE Frameworks Version: 
Qt Version: 

ADDITIONAL INFORMATION
Comment 1 Christoph Cullmann 2022-09-22 19:09:50 UTC
Git commit 20c8b60eaab7d666eb079363111a93f0c252ff1c by Christoph Cullmann.
Committed on 22/09/2022 at 19:09.
Pushed by cullmann into branch 'master'.

avoid to use previous block that is not there

same logic as in the KSyntaxHighting highligher

M  +2    -1    apps/lib/diff/diffeditor.cpp

https://invent.kde.org/utilities/kate/commit/20c8b60eaab7d666eb079363111a93f0c252ff1c
Comment 2 Christoph Cullmann 2022-09-22 19:10:44 UTC
Can't reproduce, but perhaps my change helps.
Comment 3 Christoph Cullmann 2022-09-23 20:26:11 UTC
My fix was not sufficient, but I missed to get a backtrace for my crash today.
Comment 4 Eric Armbruster 2022-09-23 20:28:51 UTC
You can still retrieve it using the Crashed Process Viewer (or coredumpctl list + debug), but I guess it's on your work machine.
Comment 5 Christoph Cullmann 2022-09-23 20:33:43 UTC
Good hint!

But just the same backtrace:

But ok, I see....

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f7cfe89ffa8 in QTextBlock::setUserData(QTextBlockUserData*) () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Gui.so.5
[Current thread is 1 (Thread 0x7f7cf9d5b8c0 (LWP 341887))]
(gdb) bt
#0  0x00007f7cfe89ffa8 in QTextBlock::setUserData(QTextBlockUserData*) () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Gui.so.5
#1  0x00007f7d009466c9 in DiffSyntaxHighlighter::highlightBlock (this=0x5a11ad0, text=...) at /home/cullmann/projects/kde/src/kate/apps/lib/diff/diffeditor.cpp:47
#2  0x00007f7cfe905544 in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Gui.so.5
#3  0x00007f7cfe9056f7 in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Gui.so.5
#4  0x00007f7cfe905aa9 in QSyntaxHighlighter::rehighlight() () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Gui.so.5
#5  0x00007f7d0093e096 in DiffWidget::parseAndShowDiff (this=0x5a34110, raw=...) at /home/cullmann/projects/kde/src/kate/apps/lib/diff/diffwidget.cpp:599
#6  0x00007f7d00940b15 in DiffWidget::openDiff (this=0x5a34110, raw=...) at /home/cullmann/projects/kde/src/kate/apps/lib/diff/diffwidget.cpp:771
#7  0x00007f7d008ec7d1 in KateMainWindow::showDiff (this=<optimized out>, wordDiff=..., params=...) at /home/cullmann/projects/kde/src/kate/apps/lib/katemainwindow.cpp:1356
#8  0x00007f7d0093873e in Utils::showDiff (diff=..., params=..., mainWindow=<optimized out>) at /home/cullmann/projects/kde/src/kate/apps/lib/ktexteditor_utils.cpp:164
#9  0x00007f7ce98b580d in operator() (es=<optimized out>, exitCode=<optimized out>, __closure=0x5a470f0) at /home/cullmann/projects/kde/src/kate/addons/project/gitwidget.cpp:653
#10 QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<int, QProcess::ExitStatus>, void, GitWidget::showDiff(const QString&, bool)::<lambda(int, QProcess::ExitStatus)> >::call (
    arg=<optimized out>, f=...) at /nix/store/hxwyg9v3xhxr8xvrgmd7na58xsh3q5ix-qtbase-5.15.5-dev/include/QtCore/qobjectdefs_impl.h:146
#11 QtPrivate::Functor<GitWidget::showDiff(const QString&, bool)::<lambda(int, QProcess::ExitStatus)>, 2>::call<QtPrivate::List<int, QProcess::ExitStatus>, void> (arg=<optimized out>, f=...)
    at /nix/store/hxwyg9v3xhxr8xvrgmd7na58xsh3q5ix-qtbase-5.15.5-dev/include/QtCore/qobjectdefs_impl.h:256
#12 QtPrivate::QFunctorSlotObject<GitWidget::showDiff(const QString&, bool)::<lambda(int, QProcess::ExitStatus)>, 2, QtPrivate::List<int, QProcess::ExitStatus>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *) (which=<optimized out>, this_=0x5a470e0, r=<optimized out>, a=<optimized out>, ret=<optimized out>)
    at /nix/store/hxwyg9v3xhxr8xvrgmd7na58xsh3q5ix-qtbase-5.15.5-dev/include/QtCore/qobjectdefs_impl.h:443
#13 0x00007f7cfe200f73 in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Core.so.5
#14 0x00007f7cfe135248 in QProcess::finished(int, QProcess::ExitStatus) () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Core.so.5
#15 0x00007f7cfe13acb3 in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Core.so.5
#16 0x00007f7cfe13adde in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Core.so.5
#17 0x00007f7cfe200fa8 in ?? () from /nix/store/634m9rf1xclq7vdcpgqfqaiahgwdjkfy-qtbase-5.15.5/lib/libQt5Core.so.5
#18 0x00007f7cfe20434f in QSocketNotifier::activated(QSocketDescriptor, QSocketNotifier::Type, QSocketNotifier::QPrivateSignal) ()
Comment 6 Christoph Cullmann 2022-09-23 20:36:01 UTC
Git commit c277ed7d96facba3a58e797023ab613e564d8f3a by Christoph Cullmann.
Committed on 23/09/2022 at 20:35.
Pushed by cullmann into branch 'master'.

avoid double delete

M  +2    -4    apps/lib/diff/diffeditor.cpp

https://invent.kde.org/utilities/kate/commit/c277ed7d96facba3a58e797023ab613e564d8f3a
Comment 7 Christoph Cullmann 2022-09-23 20:36:28 UTC
void QTextBlock::setUserData(QTextBlockUserData *data)
{
    if (!p || !n)
        return;

    const QTextBlockData *b = p->blockMap().fragment(n);
    if (data != b->userData)
        delete b->userData;
    b->userData = data;
}

=> we did a double delete