Subject: Bug#761: x2goclient segfaults if terminate button is repeatedly clicked

From: Vicent <[email-masked]>
Date: Fri, 23 Jan 2015 00:18:34 +0100

Package: x2goclient
Version: 4.0.3.1
Tag: patch

When the Terminate button is clicked, several seconds pass until the
session is efectively terminated and the window reflects the changes.

If the botton is pressed another time, the program segfaults.

*The steps you took to produce the bug*

Start any connection. Terminate connection with Terminate button or closing
the window. Repeatedly click terminate button.

*Any exact error messages*

Segfault

*What you expected to happen*

The button should do nothing if clicked a segond time.

*What actually happened*

Crash

*The client machine's OS*

Archlinux fully updated

*The client machine's version of X2GoClient*

Latest version from git, also in the one in archlinux repo

*Any relevant session settings in X2GoClient, PyHoca-GUI or Pyhoca-CLI*

Nothing

*The server's OS*

Archlinux, fully updated

Latest stable version of the software is used in the server, from Archlinux
repositories, but server software is not relevant.

*Backtrace*

#0  0x00007ffff5b032e0 in QProcess::terminate() () from /usr/lib/libQtCore.so.4
#1  0x0000000000471ced in ONMainWindow::termSession (this=0xa92620,
sessId=..., warn=false) at ../onmainwindow.cpp:5968
#2  0x00000000004698cb in ONMainWindow::slotTermSessFromSt
(this=0xa92620) at ../onmainwindow.cpp:4587
#3  0x00000000004f43cd in ONMainWindow::qt_static_metacall
(_o=0xa92620, _c=QMetaObject::InvokeMetaMethod, _id=42,
_a=0x7fffffffd7d0) at moc_onmainwindow.cpp:366
#4  0x00007ffff5b89d9c in QMetaObject::activate(QObject*, QMetaObject
const*, int, void**) () from /usr/lib/libQtCore.so.4
#5  0x00007ffff6a7f962 in QAbstractButton::clicked(bool) () from
/usr/lib/libQtGui.so.4
#6  0x00007ffff67beef3 in ?? () from /usr/lib/libQtGui.so.4
#7  0x00007ffff67c02a4 in ?? () from /usr/lib/libQtGui.so.4
#8  0x00007ffff67c03b4 in
QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from
/usr/lib/libQtGui.so.4
#9  0x00007ffff68824ba in QToolButton::mouseReleaseEvent(QMouseEvent*)
() from /usr/lib/libQtGui.so.4
#10 0x00007ffff6442c08 in QWidget::event(QEvent*) () from /usr/lib/libQtGui.so.4
#11 0x00007ffff63ef9ac in QApplicationPrivate::notify_helper(QObject*,
QEvent*) () from /usr/lib/libQtGui.so.4
#12 0x00007ffff63f656f in QApplication::notify(QObject*, QEvent*) ()
from /usr/lib/libQtGui.so.4
#13 0x00007ffff5b7528d in QCoreApplication::notifyInternal(QObject*,
QEvent*) () from /usr/lib/libQtCore.so.4
#14 0x00007ffff63f5bcf in
QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*,
QWidget*, QWidget**, QPointer<QWidget>&, bool) () from
/usr/lib/libQtGui.so.4
#15 0x00007ffff646c7a2 in ?? () from /usr/lib/libQtGui.so.4
#16 0x00007ffff646b19c in QApplication::x11ProcessEvent(_XEvent*) ()
from /usr/lib/libQtGui.so.4
#17 0x00007ffff64932e2 in ?? () from /usr/lib/libQtGui.so.4
#18 0x00007ffff1f0ea0d in g_main_context_dispatch () from
/usr/lib/libglib-2.0.so.0
#19 0x00007ffff1f0ecf8 in ?? () from /usr/lib/libglib-2.0.so.0
#20 0x00007ffff1f0edac in g_main_context_iteration () from
/usr/lib/libglib-2.0.so.0
#21 0x00007ffff5ba437d in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
() from /usr/lib/libQtCore.so.4
#22 0x00007ffff64933a6 in ?? () from /usr/lib/libQtGui.so.4
#23 0x00007ffff5b73de1 in
QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
from /usr/lib/libQtCore.so.4
#24 0x00007ffff5b74145 in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from
/usr/lib/libQtCore.so.4
#25 0x00007ffff5b796e9 in QCoreApplication::exec() () from
/usr/lib/libQtCore.so.4
#26 0x00000000004dccd6 in x2goMain (argc=1, argv=0x7fffffffe688) at
../ongetpass.cpp:108
#27 0x00000000004f354c in main (argc=1, argv=0x7fffffffe688) at
../x2goclient.cpp:22
From d8aa69174c16b6cc24717fc423eb21982c11cb66 Mon Sep 17 00:00:00 2001
From: Vicent Selfa <[email-masked]>
Date: Fri, 23 Jan 2015 00:14:06 +0100
Subject: [PATCH] Fix segfault terminating sessions

---
 onmainwindow.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/onmainwindow.cpp b/onmainwindow.cpp
index 8e2e11a..962552d 100644
--- a/onmainwindow.cpp
+++ b/onmainwindow.cpp
@@ -5935,6 +5935,9 @@ void ONMainWindow::suspendSession ( QString sessId )
 
 bool ONMainWindow::termSession ( QString sessId, bool warn )
 {
+	if ( !nxproxy )
+		return true;
+
     if ( warn )
     {
         bool hide_after=false;
-- 
2.2.2