29 lines
1.2 KiB
Diff
29 lines
1.2 KiB
Diff
# UNDF: UNDF-2026-000000238
|
|
--- a/deps/rabbit/src/rabbit_stream_sac_coordinator.erl
|
|
+++ b/deps/rabbit/src/rabbit_stream_sac_coordinator.erl
|
|
@@ -200,15 +200,18 @@ filter_dead_pids(Pids) ->
|
|
- lists:filter(fun(Pid) -> not is_pid_alive(Pid) end, Pids).
|
|
+ MemberSet = gb_sets:from_list(rabbit_nodes:list_members()), %% CWE-407 fix: hoist O(N) list build outside filter
|
|
+ lists:filter(fun(Pid) -> not is_pid_alive(Pid, MemberSet) end, Pids).
|
|
|
|
-is_pid_alive(Pid) when node(Pid) =:= node() ->
|
|
+is_pid_alive(Pid) ->
|
|
+ is_pid_alive(Pid, gb_sets:from_list(rabbit_nodes:list_members())).
|
|
+
|
|
+is_pid_alive(Pid, _MemberSet) when node(Pid) =:= node() ->
|
|
erlang:is_process_alive(Pid);
|
|
-is_pid_alive(Pid) ->
|
|
+is_pid_alive(Pid, MemberSet) ->
|
|
PidNode = node(Pid),
|
|
- case lists:member(PidNode, rabbit_nodes:list_members()) of
|
|
+ case gb_sets:is_member(PidNode, MemberSet) of %% CWE-407 fix: O(log N) gb_sets lookup vs O(N) list scan
|
|
true ->
|
|
try
|
|
erpc:call(PidNode, erlang, is_process_alive, [Pid], 5000)
|
|
catch
|
|
_:_ ->
|
|
true
|
|
end;
|
|
false ->
|
|
false
|
|
end.
|