From 5c14bfd8c6670519e06d01115624de8c6afd49a5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 29 Mar 2021 19:32:42 +0200 Subject: ipc: Fix socket handling Speculatively fixes #5344 (cherry picked from commit 4a2c6c76241d6554e5fa3cfe358cfe16646728a0) --- qutebrowser/misc/ipc.py | 22 ++++++++++++++-------- tests/unit/misc/test_ipc.py | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/qutebrowser/misc/ipc.py b/qutebrowser/misc/ipc.py index 34c31ec4a..86f0422f3 100644 --- a/qutebrowser/misc/ipc.py +++ b/qutebrowser/misc/ipc.py @@ -356,32 +356,38 @@ class IPCServer(QObject): self.got_args.emit(args, target_arg, cwd) - @pyqtSlot() - def on_ready_read(self): - """Read json data from the client.""" + def _get_socket(self): + """Get the current socket for on_ready_read.""" if self._socket is None: # pragma: no cover # 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!") + log.ipc.warning("In _get_socket with None socket and old_socket!") + return None + log.ipc.debug("In _get_socket with None socket!") socket = self._old_socket else: socket = self._socket if sip.isdeleted(socket): # pragma: no cover log.ipc.warning("Ignoring deleted IPC socket") - return + return None + return socket + + @pyqtSlot() + def on_ready_read(self): + """Read json data from the client.""" self._timer.stop() + + socket = self._get_socket() 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(socket), data)) self._handle_data(data) + socket = self._get_socket() if self._socket is not None: self._timer.start() diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py index c19d0bc42..7df7d53c4 100644 --- a/tests/unit/misc/test_ipc.py +++ b/tests/unit/misc/test_ipc.py @@ -605,7 +605,7 @@ def test_ipcserver_socket_none_readyread(ipc_server, caplog): 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!" + msg = "In _get_socket with None socket and old_socket!" assert msg in caplog.messages -- cgit v1.2.3-54-g00ecf