From 7b2ad7944a63cf5e98693a4c797330fb3410e907 Mon Sep 17 00:00:00 2001 From: "zed-zippy[bot]" <234243425+zed-zippy[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:07:42 +0000 Subject: [PATCH] Potentially fix hang when opening LSP menu (#49046) (cherry-pick to stable) (#49049) Cherry-pick of #49046 to stable ---- It is maybe possible that, if a process's parent dies, the PID can be reused by a different process. This could cause an infinite loop in `is_descendant_of`. To fix this, break out of the loop when a cycle is detected. - [ ] Tests or screenshots needed? - [X] Code Reviewed - [X] Manual QA Release Notes: - N/A --------- Co-authored-by: Eric Holk Co-authored-by: John Tur Co-authored-by: Eric Holk --- crates/language_tools/src/lsp_button.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/language_tools/src/lsp_button.rs b/crates/language_tools/src/lsp_button.rs index 9da38f9d6b44a7daf760419a88d07b39a684533d..2a34c17c1d145aec5bbd9bc9f6adb901ef56a007 100644 --- a/crates/language_tools/src/lsp_button.rs +++ b/crates/language_tools/src/lsp_button.rs @@ -125,7 +125,11 @@ impl ProcessMemoryCache { fn is_descendant_of(&self, pid: Pid, root_pid: Pid, parent_map: &HashMap) -> bool { let mut current = pid; + let mut visited = HashSet::default(); while current != root_pid { + if !visited.insert(current) { + return false; + } match parent_map.get(¤t) { Some(&parent) => current = parent, None => return false,