Skip to content

Commit 3596431

Browse files
committed
socket_fast_read could end up spinning forever retrying on timeouts
1 parent 2ad69ab commit 3596431

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

xpra/net/socket_util.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,29 @@ def peek_connection(conn, timeout: int = PEEK_TIMEOUT_MS, size: int = PEEK_SIZE)
283283
return peek_data
284284

285285

286-
def socket_fast_read(conn) -> bytes:
286+
def socket_fast_read(conn, timeout=1) -> bytes:
287+
def noretry(_err) -> bool:
288+
return False
289+
can_retry = conn.can_retry
290+
conn.can_retry = noretry
291+
start = monotonic()
287292
try:
288-
conn._socket.settimeout(0.001)
289-
data = conn.read(1)
290-
return data or b""
293+
while monotonic() - start < timeout:
294+
try:
295+
conn._socket.settimeout(0.01)
296+
data = conn.read(1)
297+
return data or b""
298+
except TimeoutError:
299+
log = get_network_logger()
300+
log("socket_fast_read(%s) timeout", conn)
301+
continue
291302
except OSError:
292303
log = get_network_logger()
293304
log.error("Error reading from %s", conn, exc_info=True)
294305
return b""
306+
finally:
307+
conn.can_retry = can_retry
308+
return b""
295309

296310

297311
POSIX_TCP_INFO = (

0 commit comments

Comments
 (0)