[X2Go-Commits] [x2goclient] 03/03: src/{onmainwindow, sshmasterconnection}.{cpp, h}: correctly initialize and finalize libssh.

git-admin at x2go.org git-admin at x2go.org
Sat Sep 9 05:44:35 CEST 2017


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository x2goclient.

commit 07a37d3aa378f18de6a8aa9a268fc90ef10e38bc
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Sat Sep 9 05:37:56 2017 +0200

    src/{onmainwindow,sshmasterconnection}.{cpp,h}: correctly initialize and finalize libssh.
    
    We ought to do both only once - in our main thread.
    
    Previously, we initialized libssh in a new thread, which might be
    problematic.
---
 debian/changelog            |  4 ++++
 src/onmainwindow.cpp        | 22 +++++++++++++++++++++-
 src/onmainwindow.h          |  2 ++
 src/sshmasterconnection.cpp | 41 -----------------------------------------
 src/sshmasterconnection.h   |  1 -
 5 files changed, 27 insertions(+), 43 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index c81d01c..43bfe2a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -188,6 +188,10 @@ x2goclient (4.1.0.1-0x2go1) UNRELEASED; urgency=medium
       Client is multi-threaded.
     - copy-deps-win32.bat: also copy libssh_threads.dll to go with the
       previous change.
+    - src/{onmainwindow,sshmasterconnection}.{cpp,h}: correctly initialize and
+      finalize libssh. We ought to do both only once - in our main thread.
+      Previously, we initialized libssh in a new thread, which might be
+      problematic.
   * x2goclient.spec:
     - Respect %{optflags} and pass QMAKE_STRIP=: to fix missing debug info
       issues.
diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp
index b7f65d7..0cb4f2c 100644
--- a/src/onmainwindow.cpp
+++ b/src/onmainwindow.cpp
@@ -550,6 +550,8 @@ ONMainWindow::ONMainWindow ( QWidget *parent ) :QMainWindow ( parent )
         activateWindow();
         raise();
     }
+
+    QTimer::singleShot (200, this, SLOT (slotInitLibssh ()));
 }
 
 
@@ -1607,7 +1609,13 @@ void ONMainWindow::closeClient()
 #endif
         cleanPortable();
     }
-    SshMasterConnection::finalizeLibSsh();
+
+    if (ssh_finalize ()) {
+        x2goDebug << "Unable to finalize libssh. Something may be wrong!";
+    }
+    else {
+        x2goDebug << "libssh finalized.";
+    }
 
     x2goInfof(7)<<tr("Finished X2Go Client closing hooks.");
 }
@@ -12935,6 +12943,18 @@ long ONMainWindow::findWindow ( QString text )
     return 0;
 }
 
+void ONMainWindow::slotInitLibssh () {
+  /* Initialize libssh. This must be done outside of any threading context. */
+  x2goDebug << "libssh not initialized yet. Initializing.";
+  ssh_threads_set_callbacks(ssh_threads_get_pthread ());
+  if (ssh_init ()) {
+      x2goDebug << "Cannot initialize libssh.";
+      QMessageBox::critical (this, tr ("libssh initialization failure"),
+                             tr ("Unable to initialize libssh."));
+      trayQuit ();
+  }
+}
+
 //////////////////////////plugin stuff//////////////
 
 #ifdef CFGPLUGIN
diff --git a/src/onmainwindow.h b/src/onmainwindow.h
index a7aa00d..a5d518f 100644
--- a/src/onmainwindow.h
+++ b/src/onmainwindow.h
@@ -45,6 +45,7 @@
 #include <QLocale>
 #include <QProcessEnvironment>
 #include <QDirIterator>
+#include <libssh/callbacks.h>
 #include "sshmasterconnection.h"
 #include "non_modal_messagebox.h"
 
@@ -1166,6 +1167,7 @@ private slots:
     void slotReconnectSession();
     void slotStartBroker();
     void slotStartNewBrokerSession ();
+    void slotInitLibssh ();
 #ifdef Q_OS_DARWIN
     void slotSetModMap();
     void handle_xmodmap_error (QProcess &proc);
diff --git a/src/sshmasterconnection.cpp b/src/sshmasterconnection.cpp
index e0ea7d2..c0360b8 100644
--- a/src/sshmasterconnection.cpp
+++ b/src/sshmasterconnection.cpp
@@ -54,8 +54,6 @@
 #undef SSH_DEBUG
 // #define SSH_DEBUG
 
-static bool isLibSshInited=false;
-
 const QString SshMasterConnection::challenge_auth_code_prompts_[] = {
   "Verification code:",            // GA      (http://github.com/google/google-authenticator)
   "One-time password (OATH) for",  // OATH    (http://www.nongnu.org/oath-toolkit/pam_oath.html)
@@ -566,29 +564,6 @@ void SshMasterConnection::run()
         }
     }
     disconnectSessionFlag=false;
-    if ( !isLibSshInited )
-    {
-#ifdef DEBUG
-        x2goDebug<<"libssh not initialized yet. Initializing.";
-#endif
-        if ( ssh_init() !=0 )
-        {
-            QString err=tr ( "Cannot initialize libssh." );
-#ifdef DEBUG
-            x2goDebug<<err<<endl;
-#endif
-            emit connectionError ( err,"" );
-            quit();
-            return;
-        }
-        isLibSshInited=true;
-    }
-#ifdef DEBUG
-    else
-    {
-        x2goDebug<<"libssh already initialized.";
-    }
-#endif
 
 #ifdef SSH_DEBUG
     int verbosity=SSH_LOG_PACKET;
@@ -836,22 +811,6 @@ SshMasterConnection::~SshMasterConnection()
 }
 
 
-void SshMasterConnection::finalizeLibSsh()
-{
-    if ( !isLibSshInited )
-    {
-#ifdef DEBUG
-        x2goDebug<<"libssh not initialized yet.";
-#endif
-        return;
-    }
-
-    ssh_finalize();
-#ifdef DEBUG
-    x2goDebug<<"libssh finalized.";
-#endif
-}
-
 bool SshMasterConnection::sshConnect()
 {
     int rc;
diff --git a/src/sshmasterconnection.h b/src/sshmasterconnection.h
index 18ef0a4..e6924e0 100644
--- a/src/sshmasterconnection.h
+++ b/src/sshmasterconnection.h
@@ -81,7 +81,6 @@ public:
                         QString proxylogin=QString::null, QString proxypassword=QString::null, QString proxyKey=QString::null,
                         bool proxyAutologin=false, bool proxyKrbLogin=false);
     ~SshMasterConnection();
-    static void finalizeLibSsh();
     void addChannelConnection(SshProcess* creator, int sock, QString forwardHost,
                               int forwardPort, QString localHost, int localPort, void* channel=0l);
     void addChannelConnection(SshProcess* creator, QString uuid, QString cmd);

--
Alioth's /srv/git/code.x2go.org/x2goclient.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goclient.git


More information about the x2go-commits mailing list