java-topology/defects/rabbitmq/patch/rmq-0002-sac-coordinator-gb-sets.patch

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.