From 34bdb47251b93bcfc767aec341490386a08ba4a6 Mon Sep 17 00:00:00 2001 From: Ivan Alejandro Date: Tue, 30 Dec 2014 19:53:14 -0300 Subject: Disable signal disconnection and untrack. This temporary hack prevents the app to have segfaults when the first run wizard finishes. For more information look at https://leap.se/code/issues/6597 --- src/leap/bitmask/gui/mainwindow.py | 22 ++++++++++++++++++---- src/leap/bitmask/gui/signaltracker.py | 13 +++++++++++-- src/leap/bitmask/gui/wizard.py | 3 ++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py index 7d55a5d5..b0826303 100644 --- a/src/leap/bitmask/gui/mainwindow.py +++ b/src/leap/bitmask/gui/mainwindow.py @@ -288,7 +288,11 @@ class MainWindow(QtGui.QMainWindow, SignalTracker): if self._first_run(): self._wizard_firstrun = True - self.disconnect_and_untrack() + + # HACK FIX: disconnection of signals triggers a reconnection later + # chich segfaults on wizard quit + # self.disconnect_and_untrack() + self._wizard = Wizard(backend=self._backend, leap_signaler=self._leap_signaler) # Give this window time to finish init and then show the wizard @@ -341,6 +345,8 @@ class MainWindow(QtGui.QMainWindow, SignalTracker): conntrack = self.connect_and_track # XXX does this goes in here? this will be triggered when the login or # wizard requests provider data + + # XXX - here segfaults if we did a disconnect_and_untrack conntrack(sig.prov_check_api_certificate, self._get_provider_details) conntrack(sig.prov_get_details, self._provider_get_details) @@ -417,7 +423,11 @@ class MainWindow(QtGui.QMainWindow, SignalTracker): # This happens if the user finishes the provider # setup but does not register self._wizard = None - self._backend_connect(only_tracked=True) + + # HACK FIX: disconnection of signals triggers a reconnection later + # chich segfaults on wizard quit + # self._backend_connect(only_tracked=True) + if self._wizard_firstrun: self._finish_init() @@ -433,7 +443,9 @@ class MainWindow(QtGui.QMainWindow, SignalTracker): there. """ if self._wizard is None: - self.disconnect_and_untrack() + # HACK FIX: disconnection of signals triggers a reconnection later + # chich segfaults on wizard quit + # self.disconnect_and_untrack() self._wizard = Wizard(backend=self._backend, leap_signaler=self._leap_signaler) self._wizard.accepted.connect(self._finish_init) @@ -764,7 +776,9 @@ class MainWindow(QtGui.QMainWindow, SignalTracker): self.eip_needs_login.emit() self._wizard = None - self._backend_connect(only_tracked=True) + # HACK FIX: disconnection of signals triggers a reconnection later + # chich segfaults on wizard quit + # self._backend_connect(only_tracked=True) else: domain = self._settings.get_provider() if domain is not None: diff --git a/src/leap/bitmask/gui/signaltracker.py b/src/leap/bitmask/gui/signaltracker.py index 4884334d..c83359c4 100644 --- a/src/leap/bitmask/gui/signaltracker.py +++ b/src/leap/bitmask/gui/signaltracker.py @@ -14,9 +14,12 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . +import logging from PySide import QtCore +logger = logging.getLogger(__name__) + class SignalTracker(QtCore.QObject): """ @@ -39,6 +42,10 @@ class SignalTracker(QtCore.QObject): :param method: the method to call when the signal is triggered. :type method: callable, Slot or Signal """ + if (signal, method) in self._connected_signals: + logger.warning("Signal already connected.") + return + self._connected_signals.append((signal, method)) signal.connect(method) @@ -49,7 +56,9 @@ class SignalTracker(QtCore.QObject): for signal, method in self._connected_signals: try: signal.disconnect(method) - except RuntimeError: - pass # Signal was not connected + except (TypeError, RuntimeError) as e: + # most likely the signal was not connected + logger.warning("Disconnect error: {0!r}".format(e)) + logger.warning("Signal: {0!r} -> {1!r}".format(signal, method)) self._connected_signals = [] diff --git a/src/leap/bitmask/gui/wizard.py b/src/leap/bitmask/gui/wizard.py index f1eab211..35043a68 100644 --- a/src/leap/bitmask/gui/wizard.py +++ b/src/leap/bitmask/gui/wizard.py @@ -152,7 +152,8 @@ class Wizard(QtGui.QWizard, SignalTracker): self._provider_setup_ok = False self.ui.lnProvider.setText('') self.ui.grpCheckProvider.setVisible(False) - self.disconnect_and_untrack() + # HACK FIX: disconnection of signals triggers a segfault on quit + # self.disconnect_and_untrack() def _load_configured_providers(self): """ -- cgit v1.2.3