From 15d461c234cb565f523c516147f087e05f764296 Mon Sep 17 00:00:00 2001 From: Debian Date: Sun, 13 Sep 2026 14:00:13 +0200 Subject: [PATCH] Fix ZMQ socket monitor leak and guard monitor recv against races Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- lib/network.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/network.py b/lib/network.py index 3809d7f..3e16069 100644 --- a/lib/network.py +++ b/lib/network.py @@ -9,6 +9,8 @@ import struct import logging import time +from .constants import STATS_CONNECTION_DELAY + logger = logging.getLogger('network') @@ -37,11 +39,11 @@ def check_monitor(monitor): """Check monitor socket for events""" try: event_monitor = monitor.recv(zmq.NOBLOCK) + event_id, event_name, event_value = read_socket_event(event_monitor) + event_endpoint = monitor.recv(zmq.NOBLOCK) except zmq.Again: return None - event_id, event_name, event_value = read_socket_event(event_monitor) - event_endpoint = monitor.recv(zmq.NOBLOCK) logger.debug(f'Monitor: {event_name} {event_value} endpoint {event_endpoint}') return (event_id, event_value) @@ -104,6 +106,9 @@ class RconConnection: def close(self): """Close connection""" + if self.monitor: + self.monitor.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages + self.monitor.close() if self.socket: self.socket.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages self.socket.close() @@ -143,7 +148,7 @@ class StatsConnection: logger.debug('Setting ZMQ_SUBSCRIBE to empty (all messages)') self.socket.setsockopt(zmq.SUBSCRIBE, b'') - time.sleep(0.5) + time.sleep(STATS_CONNECTION_DELAY) self.connected = True logger.info('Stats stream connected')