Skip to content

Commit 85f17ca

Browse files
committed
Revert "ipc: Remove _old_socket handling"
This reverts commit c6cf306. 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
1 parent c6cf306 commit 85f17ca

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

qutebrowser/misc/ipc.py

+18-9
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ def __init__(self, socketname, parent=None):
195195
self.handle_connection)
196196

197197
self._socket = None
198+
self._old_socket = None
198199

199200
if utils.is_windows: # pragma: no cover
200201
# As a WORKAROUND for a Qt bug, we can't use UserAccessOption on Unix. If we
@@ -288,13 +289,12 @@ def handle_connection(self):
288289
@pyqtSlot()
289290
def on_disconnected(self):
290291
"""Clean up socket when the client disconnected."""
291-
if self._socket is None:
292-
log.ipc.debug("Disconnected with None-socket.")
293-
return
294292
log.ipc.debug("Client disconnected from socket 0x{:x}.".format(
295293
id(self._socket)))
296294
self._timer.stop()
297-
self._socket.deleteLater()
295+
if self._old_socket is not None:
296+
self._old_socket.deleteLater()
297+
self._old_socket = self._socket
298298
self._socket = None
299299
# Maybe another connection is waiting.
300300
self.handle_connection()
@@ -360,18 +360,27 @@ def _handle_data(self, data):
360360
def on_ready_read(self):
361361
"""Read json data from the client."""
362362
if self._socket is None: # pragma: no cover
363-
return
363+
# This happens when doing a connection while another one is already
364+
# active for some reason.
365+
if self._old_socket is None:
366+
log.ipc.warning("In on_ready_read with None socket and "
367+
"old_socket!")
368+
return
369+
log.ipc.debug("In on_ready_read with None socket!")
370+
socket = self._old_socket
371+
else:
372+
socket = self._socket
364373

365-
if sip.isdeleted(self._socket): # pragma: no cover
374+
if sip.isdeleted(socket): # pragma: no cover
366375
log.ipc.warning("Ignoring deleted IPC socket")
367376
return
368377

369378
self._timer.stop()
370-
while self._socket is not None and self._socket.canReadLine():
371-
data = bytes(self._socket.readLine())
379+
while socket is not None and socket.canReadLine():
380+
data = bytes(socket.readLine())
372381
self.got_raw.emit(data)
373382
log.ipc.debug("Read from socket 0x{:x}: {!r}".format(
374-
id(self._socket), data))
383+
id(socket), data))
375384
self._handle_data(data)
376385

377386
if self._socket is not None:

tests/unit/misc/test_ipc.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -600,9 +600,13 @@ def test_timeout(qtbot, caplog, qlocalsocket, ipc_server):
600600
assert caplog.messages[-1].startswith("IPC connection timed out")
601601

602602

603-
def test_ipcserver_socket_none_readyread(ipc_server):
603+
def test_ipcserver_socket_none_readyread(ipc_server, caplog):
604604
assert ipc_server._socket is None
605-
ipc_server.on_ready_read()
605+
assert ipc_server._old_socket is None
606+
with caplog.at_level(logging.WARNING):
607+
ipc_server.on_ready_read()
608+
msg = "In on_ready_read with None socket and old_socket!"
609+
assert msg in caplog.messages
606610

607611

608612
@pytest.mark.posix

0 commit comments

Comments
 (0)