mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-31 16:21:50 +03:00
fix(runtime): keep process probes host-safe
This commit is contained in:
@@ -351,7 +351,10 @@ class ManagedProcessRuntime(Generic[_StartOptionsT]):
|
|||||||
return process_is_running(pid, platform_name=self.platform_name)
|
return process_is_running(pid, platform_name=self.platform_name)
|
||||||
|
|
||||||
def _process_identity(self, pid: int) -> str | int | None:
|
def _process_identity(self, pid: int) -> str | int | None:
|
||||||
if self.platform_name == "Windows":
|
# Process inspection must follow the host API even when tests inject a
|
||||||
|
# target platform. On Windows, falling through to POSIX calls is not
|
||||||
|
# merely unsupported: ``os.kill(pid, 0)`` broadcasts CTRL_C_EVENT.
|
||||||
|
if _platform_name() == "Windows" or self.platform_name == "Windows":
|
||||||
return _windows_process_identity(pid)
|
return _windows_process_identity(pid)
|
||||||
try:
|
try:
|
||||||
process_group = os.getpgid(pid)
|
process_group = os.getpgid(pid)
|
||||||
@@ -441,7 +444,8 @@ def process_is_running(pid: int, *, platform_name: str | None = None) -> bool:
|
|||||||
"""Probe a PID without delivering a control event on Windows."""
|
"""Probe a PID without delivering a control event on Windows."""
|
||||||
if pid <= 0:
|
if pid <= 0:
|
||||||
return False
|
return False
|
||||||
if (platform_name or _platform_name()) == "Windows":
|
host_platform = _platform_name()
|
||||||
|
if host_platform == "Windows" or platform_name == "Windows":
|
||||||
# On Windows ``os.kill(pid, 0)`` sends CTRL_C_EVENT (whose value is 0)
|
# On Windows ``os.kill(pid, 0)`` sends CTRL_C_EVENT (whose value is 0)
|
||||||
# instead of performing the harmless POSIX existence probe.
|
# instead of performing the harmless POSIX existence probe.
|
||||||
return _windows_process_identity(pid) is not None
|
return _windows_process_identity(pid) is not None
|
||||||
|
|||||||
@@ -440,6 +440,37 @@ def test_windows_process_probe_never_sends_ctrl_c(monkeypatch):
|
|||||||
assert process_is_running(54321, platform_name="Windows") is False
|
assert process_is_running(54321, platform_name="Windows") is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_windows_host_probe_stays_safe_when_target_platform_is_posix(monkeypatch):
|
||||||
|
monkeypatch.setattr("nanobot.process_runtime._platform_name", lambda: "Windows")
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"nanobot.process_runtime._windows_process_identity",
|
||||||
|
lambda pid: "created-at" if pid == 12345 else None,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"nanobot.process_runtime.os.kill",
|
||||||
|
lambda *_args: pytest.fail("Windows process probes must not call os.kill(pid, 0)"),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert process_is_running(12345, platform_name="Linux") is True
|
||||||
|
assert process_is_running(54321, platform_name="Darwin") is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_windows_host_identity_stays_safe_when_target_platform_is_posix(tmp_path, monkeypatch):
|
||||||
|
runtime = GatewayRuntime(paths=_paths(tmp_path), platform_name="Linux")
|
||||||
|
monkeypatch.setattr("nanobot.process_runtime._platform_name", lambda: "Windows")
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"nanobot.process_runtime._windows_process_identity",
|
||||||
|
lambda pid: "created-at" if pid == 12345 else None,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"nanobot.process_runtime.os.getpgid",
|
||||||
|
lambda *_args: pytest.fail("Windows process identities must not use POSIX APIs"),
|
||||||
|
raising=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert runtime.process_identity(12345) == "created-at"
|
||||||
|
|
||||||
|
|
||||||
def test_status_clears_stale_state(tmp_path, monkeypatch):
|
def test_status_clears_stale_state(tmp_path, monkeypatch):
|
||||||
runtime = GatewayRuntime(paths=_paths(tmp_path), platform_name="Linux")
|
runtime = GatewayRuntime(paths=_paths(tmp_path), platform_name="Linux")
|
||||||
runtime.paths.run_dir.mkdir(parents=True)
|
runtime.paths.run_dir.mkdir(parents=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user