From f9872bb7b8e3bc01eb72c5a21be7e27dc19fd392 Mon Sep 17 00:00:00 2001 From: David Nadlinger Date: Fri, 22 Jan 2021 19:13:42 +0100 Subject: [PATCH] coredevice: Handle prematurely closed sockets in comm_kernel receive loop recv() returns 0 instead of data if the socket has already been closed. This is translated into a zero-length list on the Python layer. Previously, the code would enter an infinite loop if the socket was closed while attempting to receive data. --- artiq/coredevice/comm_kernel.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/artiq/coredevice/comm_kernel.py b/artiq/coredevice/comm_kernel.py index eb34a3fdf..e5340d19c 100644 --- a/artiq/coredevice/comm_kernel.py +++ b/artiq/coredevice/comm_kernel.py @@ -223,7 +223,10 @@ class CommKernel: flag = 0 if diff > 8192: flag |= socket.MSG_WAITALL - self.read_buffer += self.socket.recv(8192, flag) + new_buffer = self.socket.recv(8192, flag) + if not new_buffer: + raise ConnectionResetError("Core device connection closed unexpectedly") + self.read_buffer += new_buffer result = self.read_buffer[:length] self.read_buffer = self.read_buffer[length:] return result