Skip to content

Commit

Permalink
Revert "ipc: Remove _old_socket handling"
Browse files Browse the repository at this point in the history
This reverts commit c6cf3067e158265096410afee98407826b19c472.

Seems to cause segfaults:

  #0  0x00007ffff5cecbcc in void doActivate<false>(QObject*, int, void**) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #1  0x00007ffff5be4e31 in QIODevice::channelReadyRead(int) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #2  0x00007fffeffccb54 in QAbstractSocketPrivate::canReadNotification() () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Network.so.5
  #3  0x00007fffeffdf061 in QReadNotifier::event(QEvent*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Network.so.5
  #4  0x00007ffff269e43c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
  #5  0x00007ffff26a4f20 in QApplication::notify(QObject*, QEvent*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Widgets.so.5
  #6  0x00007ffff318d0d6 in sipQApplication::notify(QObject*, QEvent*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/QtWidgets.abi3.so
  #7  0x00007ffff5cb4808 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #8  0x00007ffff5d10d98 in socketNotifierSourceDispatch(_GSource*, int (*)(void*), void*) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #9  0x00007ffff691df9c in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
  #10 0x00007ffff6971a49 in ?? () from /usr/lib/libglib-2.0.so.0
  #11 0x00007ffff691b6f1 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
  #12 0x00007ffff5d101cc in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #13 0x00007ffff5cb321a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  #14 0x00007ffff5cbc1d3 in QCoreApplication::exec() () from /home/florian/proj/qutebrowser/git/.tox/py39-pyqt515/lib/python3.9/site-packages/PyQt5/Qt5/lib/libQt5Core.so.5
  • Loading branch information
The-Compiler committed Mar 29, 2021
1 parent 26c1b5b commit 6fe5414
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
27 changes: 18 additions & 9 deletions qutebrowser/misc/ipc.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ def __init__(self, socketname, parent=None):
self.handle_connection)

self._socket = None
self._old_socket = None

if utils.is_windows: # pragma: no cover
# As a WORKAROUND for a Qt bug, we can't use UserAccessOption on Unix. If we
Expand Down Expand Up @@ -288,13 +289,12 @@ def handle_connection(self):
@pyqtSlot()
def on_disconnected(self):
"""Clean up socket when the client disconnected."""
if self._socket is None:
log.ipc.debug("Disconnected with None-socket.")
return
log.ipc.debug("Client disconnected from socket 0x{:x}.".format(
id(self._socket)))
self._timer.stop()
self._socket.deleteLater()
if self._old_socket is not None:
self._old_socket.deleteLater()
self._old_socket = self._socket
self._socket = None
# Maybe another connection is waiting.
self.handle_connection()
Expand Down Expand Up @@ -360,18 +360,27 @@ def _handle_data(self, data):
def on_ready_read(self):
"""Read json data from the client."""
if self._socket is None: # pragma: no cover
return
# This happens when doing a connection while another one is already
# active for some reason.
if self._old_socket is None:
log.ipc.warning("In on_ready_read with None socket and "
"old_socket!")
return
log.ipc.debug("In on_ready_read with None socket!")
socket = self._old_socket
else:
socket = self._socket

if sip.isdeleted(self._socket): # pragma: no cover
if sip.isdeleted(socket): # pragma: no cover
log.ipc.warning("Ignoring deleted IPC socket")
return

self._timer.stop()
while self._socket is not None and self._socket.canReadLine():
data = bytes(self._socket.readLine())
while socket is not None and socket.canReadLine():
data = bytes(socket.readLine())
self.got_raw.emit(data)
log.ipc.debug("Read from socket 0x{:x}: {!r}".format(
id(self._socket), data))
id(socket), data))
self._handle_data(data)

if self._socket is not None:
Expand Down
8 changes: 6 additions & 2 deletions tests/unit/misc/test_ipc.py
Original file line number Diff line number Diff line change
Expand Up @@ -600,9 +600,13 @@ def test_timeout(qtbot, caplog, qlocalsocket, ipc_server):
assert caplog.messages[-1].startswith("IPC connection timed out")


def test_ipcserver_socket_none_readyread(ipc_server):
def test_ipcserver_socket_none_readyread(ipc_server, caplog):
assert ipc_server._socket is None
ipc_server.on_ready_read()
assert ipc_server._old_socket is None
with caplog.at_level(logging.WARNING):
ipc_server.on_ready_read()
msg = "In on_ready_read with None socket and old_socket!"
assert msg in caplog.messages


@pytest.mark.posix
Expand Down

0 comments on commit 6fe5414

Please sign in to comment.