From 7223f22d653b65518e6e4e4805c293d2cd59fc59 Mon Sep 17 00:00:00 2001 From: annguyenNous Date: Sat, 6 Jun 2026 14:04:52 +0700 Subject: [PATCH] fix: add timeout to subprocess.run() and proc.wait() calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit subprocess.run() and proc.wait() without timeout can hang indefinitely if the child process becomes unresponsive. This blocks the calling thread forever. Fixed locations: - tools/transcription_tools.py: ffmpeg conversion (timeout=300) and user-configured STT commands with shell=True (timeout=300) - gateway/run.py: helper script proc.wait() (timeout=3600) Not fixed: - agent/anthropic_adapter.py: interactive 'claude setup-token' — user-driven, timeout would be inappropriate --- gateway/run.py | 2 +- tools/transcription_tools.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gateway/run.py b/gateway/run.py index 8bf024b9886..3a8fb06d598 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -15126,7 +15126,7 @@ class GatewayRunner: env["PYTHONUNBUFFERED"] = "1" with open(output_path, "wb") as f: proc = subprocess.Popen(cmd, stdout=f, stderr=subprocess.STDOUT, env=env) - rc = proc.wait() + rc = proc.wait(timeout=3600) with open(exit_code_path, "w") as f: f.write(str(rc)) """ diff --git a/tools/transcription_tools.py b/tools/transcription_tools.py index 2c8b8f75fc3..5238ec5738f 100644 --- a/tools/transcription_tools.py +++ b/tools/transcription_tools.py @@ -1186,7 +1186,7 @@ def _prepare_local_audio(file_path: str, work_dir: str) -> tuple[Optional[str], command = [ffmpeg, "-y", "-i", file_path, converted_path] try: - subprocess.run(command, check=True, capture_output=True, text=True) + subprocess.run(command, check=True, capture_output=True, text=True, timeout=300) return converted_path, None except subprocess.CalledProcessError as e: details = e.stderr.strip() or e.stdout.strip() or str(e) @@ -1229,9 +1229,9 @@ def _transcribe_local_command(file_path: str, model_name: str) -> Dict[str, Any] # User-provided templates (env var) may contain shell syntax; auto-detected commands are safe for list mode. use_shell = bool(os.getenv(LOCAL_STT_COMMAND_ENV, "").strip()) if use_shell: - subprocess.run(command, shell=True, check=True, capture_output=True, text=True) + subprocess.run(command, shell=True, check=True, capture_output=True, text=True, timeout=300) else: - subprocess.run(shlex.split(command), check=True, capture_output=True, text=True) + subprocess.run(shlex.split(command), check=True, capture_output=True, text=True, timeout=300) txt_files = sorted(Path(output_dir).glob("*.txt"))