tlnworker: (fix) a listening node would busy-loop if remote DC-ed early - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit c010aa327e34273280abd0951e2a3ecb558c8b63 DIR parent a81b0ecc591babb684e908c37c4e5e62145701c6 HTML Author: SomberNight <somber.night@protonmail.com> Date: Thu, 24 Sep 2020 01:52:35 +0200 lnworker: (fix) a listening node would busy-loop if remote DC-ed early StreamReader.read() returns b'' on EOF, resulting in a busy loop Diffstat: M electrum/lntransport.py | 10 ++++++++-- M electrum/lnworker.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) --- DIR diff --git a/electrum/lntransport.py b/electrum/lntransport.py t@@ -172,7 +172,10 @@ class LNResponderTransport(LNTransportBase): hs = HandshakeState(privkey_to_pubkey(self.privkey)) act1 = b'' while len(act1) < 50: - act1 += await self.reader.read(50 - len(act1)) + buf = await self.reader.read(50 - len(act1)) + if not buf: + raise HandshakeFailed('responder disconnected') + act1 += buf if len(act1) != 50: raise HandshakeFailed('responder: short act 1 read, length is ' + str(len(act1))) if bytes([act1[0]]) != HandshakeState.handshake_version: t@@ -200,7 +203,10 @@ class LNResponderTransport(LNTransportBase): # act 3 act3 = b'' while len(act3) < 66: - act3 += await self.reader.read(66 - len(act3)) + buf = await self.reader.read(66 - len(act3)) + if not buf: + raise HandshakeFailed('responder disconnected') + act3 += buf if len(act3) != 66: raise HandshakeFailed('responder: short act 3 read, length is ' + str(len(act3))) if bytes([act3[0]]) != HandshakeState.handshake_version: DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -193,8 +193,8 @@ class LNWorker(Logger, NetworkRetryManager[LNPeerAddr]): transport = LNResponderTransport(self.node_keypair.privkey, reader, writer) try: node_id = await transport.handshake() - except: - self.logger.info('handshake failure from incoming connection') + except Exception as e: + self.logger.info(f'handshake failure from incoming connection: {e!r}') return peer = Peer(self, node_id, transport) with self.lock: