From a3cf5a698fb9290cc2f321c6f7504454682a92c2 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 10 Feb 2026 12:57:17 -0500 Subject: [PATCH] Add missing timeouts to all subprocess calls Add timeout=30 to smartctl -i calls in _get_drive_details() and _check_disk_firmware(), and dmidecode in _check_memory_usage(). Add TimeoutExpired handler in _check_disk_firmware(). Prevents potential hangs when drives or system tools become unresponsive. Resolves https://code.lotusguild.org/LotusGuild/hwmonDaemon/issues/9 Co-Authored-By: Claude Opus 4.6 --- hwmonDaemon.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hwmonDaemon.py b/hwmonDaemon.py index 7a247e3..6d35342 100644 --- a/hwmonDaemon.py +++ b/hwmonDaemon.py @@ -1051,7 +1051,8 @@ class SystemHealthMonitor: ['smartctl', '-i', device], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - text=True + text=True, + timeout=30 ) # Check if smartctl failed completely @@ -2065,9 +2066,10 @@ class SystemHealthMonitor: ['smartctl', '-i', device], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - text=True + text=True, + timeout=30 ) - + model_line = None for line in result.stdout.split('\n'): if 'Firmware Version:' in line: @@ -2105,9 +2107,11 @@ class SystemHealthMonitor: logger.debug(f"Known issues: {firmware_info['known_issues']}") logger.debug("=== End Firmware Check ===\n") + except subprocess.TimeoutExpired: + logger.warning(f"smartctl -i timed out for {device}") except Exception as e: firmware_info['known_issues'].append(f"Error checking firmware: {str(e)}") - + return firmware_info # ============================================================================= @@ -2813,7 +2817,8 @@ class SystemHealthMonitor: ['dmidecode', '--type', 'memory'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - text=True + text=True, + timeout=30 ) if 'Error Correction Type: Multi-bit ECC' in result.stdout: memory_health['has_ecc'] = True