On Tue Sep 20, 2022 at 05:51:55PM +0100, Stuart Henderson wrote:
> On 2022/09/20 18:44, Róbert Bagdán wrote:
> > Hi!
> > 
> > I noticed, that krusader segfaults when close. To reproduce, start
> > krusader from terminal, and close with the close button.
> > 
> > As I see it is the same issue what was on FreeBSD [1]. The fix is on
> > upstream, but not released yet. I applied the patch, krusader builds
> > on amd64 stable/current, however I just tested on stable 7.1, works
> > fine, the segfault gone when close krusader.
> > 
> > [1] 
> > https://invent.kde.org/utilities/krusader/-/commit/415d519e825a6b8b64d2ef5f9a8e9bf7a458d1d0
> 
> Makes sense to add this. Ports standard is to apply patches in the
> patches/ directory, e.g.

OK rsadowski

> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/x11/krusader/Makefile,v
> retrieving revision 1.43
> diff -u -p -r1.43 Makefile
> --- Makefile  31 Mar 2022 16:38:32 -0000      1.43
> +++ Makefile  20 Sep 2022 16:51:31 -0000
> @@ -2,7 +2,7 @@ COMMENT=      twin panel file manager for KDE
>  
>  VERSION=     2.7.2
>  DISTNAME=    krusader-${VERSION}
> -REVISION=    1
> +REVISION=    2
>  
>  CATEGORIES=  x11
>  
> Index: patches/patch-krusader_Panel_listpanel_cpp
> ===================================================================
> RCS file: patches/patch-krusader_Panel_listpanel_cpp
> diff -N patches/patch-krusader_Panel_listpanel_cpp
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-krusader_Panel_listpanel_cpp        20 Sep 2022 16:51:31 
> -0000
> @@ -0,0 +1,50 @@
> +From 415d519e825a6b8b64d2ef5f9a8e9bf7a458d1d0 Mon Sep 17 00:00:00 2001
> +From: Adriaan de Groot <[email protected]>
> +Date: Mon, 19 Apr 2021 22:39:44 +0200
> +Subject: [PATCH] Fix crash-on-exit on FreeBSD
> +
> +Scenario:
> +- start krusader
> +- close the application (alt-f4, or click the window-close button)
> +- SEGV, with this (edited) backtrace:
> +  #0  KUrlNavigator::editor (this=0x80a562400)
> +  #1  0x000000000031e20e in ListPanel::eventFilter (this=0x80c2309c0, 
> watched=0x80a6980d0, e=0x7fffffffc278)
> +  #6  0x00000008018c3c0c in QWidget::~QWidget() () from 
> /usr/local/lib/qt5/libQt5Widgets.so.5
> +  #7  0x0000000800a26c4e in KUrlComboBox::~KUrlComboBox (this=0x80a6980d0)
> +  #11 0x00000008005de60b in KUrlNavigator::~KUrlNavigator (this=0x80a562400)
> +  #13 0x000000000031d5a5 in ListPanel::~ListPanel (this=0x80c2309c0)
> +
> +Analysis:
> +- During the destructor, events are triggered, which hit the
> +  event-filter function in the object that is undergoing destruction.
> +  Since some of the objects referred to via pointer in the event-filter
> +  are dead or being-destroyed, this is UB (so be glad it crashes!).
> +- This is very similar to the problem and backtrace in KIO commit
> +  a8a2c08014484145a4bd2a541a1cbeb8be856bf1.
> +
> +Fix:
> +- Uninstall the event-filter before carrying on with destruction.
> +- While here, add an extra nullptr check for the combobox in
> +  the event-filter.
> +
> +Index: krusader/Panel/listpanel.cpp
> +--- krusader/Panel/listpanel.cpp.orig
> ++++ krusader/Panel/listpanel.cpp
> +@@ -379,6 +379,8 @@ ListPanel::ListPanel(QWidget *parent, AbstractPanelMan
> + 
> + ListPanel::~ListPanel()
> + {
> ++    view->widget()->removeEventFilter(this);
> ++    urlNavigator->editor()->removeEventFilter(this);
> +     cancelProgress();
> +     delete view;
> +     view = 0;
> +@@ -529,7 +531,7 @@ bool ListPanel::eventFilter(QObject * watched, QEvent 
> +         }
> +     }
> +     // handle URL navigator key events
> +-    else if(watched == urlNavigator->editor()) {
> ++    else if(urlNavigator && watched == urlNavigator->editor()) {
> +         // override default shortcut for panel focus
> +         if(e->type() == QEvent::ShortcutOverride) {
> +             QKeyEvent *ke = static_cast<QKeyEvent *>(e);
> 

Reply via email to