]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Handle connection resets during reading
authorMichał Kępień <michal@isc.org>
Tue, 18 Mar 2025 15:28:18 +0000 (16:28 +0100)
committerMichał Kępień <michal@isc.org>
Tue, 18 Mar 2025 15:28:18 +0000 (16:28 +0100)
A TCP peer may reset the connection at any point, but asyncserver.py
currently only handles connection resets when it is sending data to the
client.  Handle connection resets during reading in the same way.

bin/tests/system/isctest/asyncserver.py

index 7a3285402cab1db59596a6c41127bfd9599a5cbb..6e62f483a662dfd9a50872a41f52b5a249ae6a8c 100644 (file)
@@ -542,10 +542,14 @@ class AsyncDnsServer(AsyncServer):
         peer = Peer(peer_info[0], peer_info[1])
 
         for _ in range(0, 1):
-            wire = await self._read_tcp_query(reader)
-            if not wire:
-                break
-            await self._send_tcp_response(writer, peer, wire)
+            try:
+                wire = await self._read_tcp_query(reader)
+                if not wire:
+                    break
+                await self._send_tcp_response(writer, peer, wire)
+            except ConnectionResetError:
+                logging.error("TCP connection from %s reset by peer", peer)
+                return
 
         writer.close()
         await writer.wait_closed()
@@ -587,11 +591,7 @@ class AsyncDnsServer(AsyncServer):
         responses = self._handle_query(wire, peer, DnsProtocol.TCP)
         async for response in responses:
             writer.write(response)
-            try:
-                await writer.drain()
-            except ConnectionResetError:
-                logging.error("TCP connection from %s reset by peer", peer)
-                return
+            await writer.drain()
 
     def _log_query(self, qctx: QueryContext, peer: Peer, protocol: DnsProtocol) -> None:
         logging.info(