Skip to content

Commit 02b4f30

Browse files
committed
Merge branch 'maint'
2 parents 089f2f8 + 563aea4 commit 02b4f30

2 files changed

Lines changed: 40 additions & 25 deletions

File tree

lib/ssh/src/ssh_connection.erl

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,36 +1291,49 @@ handle_msg(#ssh_msg_global_request{name = _Type,
12911291
end;
12921292

12931293
handle_msg(#ssh_msg_request_failure{},
1294-
#connection{requests = [{_, From} | Rest]} = Connection, _, _SSH) ->
1295-
{[{channel_request_reply, From, {failure, <<>>}}],
1296-
Connection#connection{requests = Rest}};
1297-
1298-
handle_msg(#ssh_msg_request_failure{},
1299-
#connection{requests = [{_, From,_} | Rest]} = Connection, _, _SSH) ->
1300-
{[{channel_request_reply, From, {failure, <<>>}}],
1301-
Connection#connection{requests = Rest}};
1294+
#connection{requests = Requests} = Connection, _, _SSH) ->
1295+
handle_global_response({failure, <<>>}, Requests, Connection);
13021296

13031297
handle_msg(#ssh_msg_request_success{data = Data},
1304-
#connection{requests = [{_, From} | Rest]} = Connection, _, _SSH) ->
1305-
{[{channel_request_reply, From, {success, Data}}],
1306-
Connection#connection{requests = Rest}};
1298+
#connection{requests = Requests} = Connection, _, _SSH) ->
1299+
handle_global_response({success, Data}, Requests, Connection).
13071300

1308-
handle_msg(#ssh_msg_request_success{data = Data},
1309-
#connection{requests = [{_, From, Fun} | Rest]} = Connection0, _, _SSH) ->
1310-
Connection = Fun({success,Data}, Connection0),
1311-
{[{channel_request_reply, From, {success, Data}}],
1312-
Connection#connection{requests = Rest}};
1313-
1314-
%% alive responses
1315-
handle_msg(#ssh_msg_request_success{},
1316-
#connection{requests = []} = Connection, _, _SSH) ->
1317-
{[], Connection};
13181301

1319-
handle_msg(#ssh_msg_request_failure{},
1320-
#connection{requests = []} = Connection, _, _SSH) ->
1321-
{[], Connection}.
1302+
1303+
%%%----------------------------------------------------------------
1304+
%%% Handle a global request response (success or failure).
1305+
%%% Finds the first global request entry and delivers the reply.
1306+
%%%
1307+
handle_global_response(Reply, Requests, Connection0) ->
1308+
case take_global_request(Requests) of
1309+
{{_, From}, Rest} ->
1310+
{[{channel_request_reply, From, Reply}],
1311+
Connection0#connection{requests = Rest}};
1312+
{{_, From, Fun}, Rest} ->
1313+
Connection = Fun(Reply, Connection0),
1314+
{[{channel_request_reply, From, Reply}],
1315+
Connection#connection{requests = Rest}};
1316+
false ->
1317+
{[], Connection0}
1318+
end.
13221319

13231320

1321+
%%%----------------------------------------------------------------
1322+
%%% Find and remove the first global request entry (keyed by reference)
1323+
%%% from the requests list, skipping channel entries (keyed by integer).
1324+
%%% Returns {Entry, RemainingList} or false.
1325+
%%%
1326+
take_global_request([]) ->
1327+
false;
1328+
take_global_request([{Ref, _} = E | Rest]) when is_reference(Ref) ->
1329+
{E, Rest};
1330+
take_global_request([{Ref, _, _} = E | Rest]) when is_reference(Ref) ->
1331+
{E, Rest};
1332+
take_global_request([H | T]) ->
1333+
case take_global_request(T) of
1334+
{E, Rest} -> {E, [H | Rest]};
1335+
false -> false
1336+
end.
13241337

13251338
%%%----------------------------------------------------------------
13261339
%%% Returns pending responses to be delivered to the peer when a

lib/ssh/src/ssh_connection_handler.erl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2105,6 +2105,8 @@ get_repl({channel_data,undefined,_Data}, Acc) ->
21052105
get_repl({channel_data,Pid,Data}, Acc) ->
21062106
Pid ! {ssh_cm, self(), Data},
21072107
Acc;
2108+
get_repl({channel_request_reply,undefined,_Data}, Acc) ->
2109+
Acc;
21082110
get_repl({channel_request_reply,From,Data}, {CallRepls,S}) ->
21092111
{[{reply,From,Data}|CallRepls], S};
21102112
get_repl({flow_control,Cache,Channel,From,Msg}, {CallRepls,S}) ->
@@ -2226,7 +2228,7 @@ triggered_alive(StateName, D0 = #data{},
22262228
{stop, Shutdown, D};
22272229
_ ->
22282230
D = send_msg({ssh_msg_global_request,"keepalive@erlang.org", true, <<>>},
2229-
D0),
2231+
add_request(fun(_,Conn) -> Conn end, make_ref(), undefined, D0)),
22302232
Ssh = D#data.ssh_params,
22312233
Now = erlang:monotonic_time(milli_seconds),
22322234
Ssh1 = Ssh#ssh{alive_probes_sent = SentProbes + 1,

0 commit comments

Comments
 (0)