File 3341-ssh-Test-case-for-some-mini-flooding-of-ssh-server.patch of Package erlang
From 5611d807d8d4f13e289147818416b8db26e755fd Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Thu, 13 Aug 2020 18:41:14 +0200
Subject: [PATCH 1/2] ssh: Test case for some mini flooding of ssh server
---
lib/ssh/test/ssh_options_SUITE.erl | 88 +++++++++++++++++++++++++++++-
1 file changed, 87 insertions(+), 1 deletion(-)
diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl
index 7d306e5c74..babac1ea7e 100644
--- a/lib/ssh/test/ssh_options_SUITE.erl
+++ b/lib/ssh/test/ssh_options_SUITE.erl
@@ -45,6 +45,8 @@
max_sessions_sftp_start_channel_sequential/1,
max_sessions_ssh_connect_parallel/1,
max_sessions_ssh_connect_sequential/1,
+ max_sessions_drops_tcp_connects/1,
+ max_sessions_drops_tcp_connects/0,
server_password_option/1,
server_userpassword_option/1,
server_pwdfun_option/1,
@@ -141,7 +143,8 @@ groups() ->
max_sessions_ssh_connect_parallel,
max_sessions_ssh_connect_sequential,
max_sessions_sftp_start_channel_parallel,
- max_sessions_sftp_start_channel_sequential
+ max_sessions_sftp_start_channel_sequential,
+ max_sessions_drops_tcp_connects
]},
{dir_options, [], [user_dir_option,
system_dir_option]}
@@ -1290,6 +1293,89 @@ try_to_connect(Connect, Host, Port, Pid, Tref, N) ->
end
end.
+%%--------------------------------------------------------------------
+max_sessions_drops_tcp_connects() ->
+ [{timetrap,{minutes,5}}].
+
+max_sessions_drops_tcp_connects(Config) ->
+ MaxSessions = 20,
+ UseSessions = 2, % Must be =< MaxSessions
+ FloodSessions = 1000,
+ ParallelLogin = true,
+ NegTimeOut = 10*1000,
+ HelloTimeOut = 1*1000,
+
+ %% Start a test daemon
+ SystemDir = filename:join(proplists:get_value(priv_dir, Config), system),
+ UserDir = proplists:get_value(priv_dir, Config),
+ {Pid, Host0, Port} =
+ ssh_test_lib:daemon([
+ {system_dir, SystemDir},
+ {user_dir, UserDir},
+ {user_passwords, [{"carni", "meat"}]},
+ {parallel_login, ParallelLogin},
+ {hello_timeout, HelloTimeOut},
+ {negotiation_timeout, NegTimeOut},
+ {max_sessions, MaxSessions}
+ ]),
+ Host = ssh_test_lib:mangle_connect_address(Host0),
+ ct:pal("~p Listen ~p:~p for max ~p sessions. Mangled Host = ~p",
+ [Pid,Host0,Port,MaxSessions,Host]),
+
+ %% Log in UseSessions connections
+ SSHconnect = fun(N) ->
+ R = ssh:connect(Host, Port,
+ [{silently_accept_hosts, true},
+ {user_dir, proplists:get_value(priv_dir,Config)},
+ {user_interaction, false},
+ {user, "carni"},
+ {password, "meat"}
+ ]),
+ ct:pal("~p: ssh:connect -> ~p", [N,R]),
+ R
+ end,
+
+ L1 = oks([SSHconnect(N) || N <- lists:seq(1,UseSessions)]),
+ case length(L1) of
+ UseSessions ->
+ %% As expected
+ %% Try gen_tcp:connect
+ [ct:pal("~p: gen_tcp:connect -> ~p",
+ [N, gen_tcp:connect(Host, Port, [])])
+ || N <- lists:seq(UseSessions+1, MaxSessions)
+ ],
+
+ ct:pal("Now try ~p gen_tcp:connect to be rejected", [FloodSessions]),
+ [ct:pal("~p: gen_tcp:connect -> ~p",
+ [N, gen_tcp:connect(Host, Port, [])])
+ || N <- lists:seq(MaxSessions+1, MaxSessions+1+FloodSessions)
+ ],
+
+ ct:pal("try ~p ssh:connect", [MaxSessions - UseSessions]),
+ try_ssh_connect(MaxSessions - UseSessions, NegTimeOut, SSHconnect);
+
+ Len1 ->
+ {fail, Len1}
+ end.
+
+try_ssh_connect(N, NegTimeOut, F) when N>0 ->
+ case F(N) of
+ {ok,_} ->
+ try_ssh_connect(N-1, NegTimeOut, F);
+ {error,_} when N==1 ->
+ try_ssh_connect(N, NegTimeOut, F);
+ {error,_} ->
+ timer:sleep(NegTimeOut),
+ try_ssh_connect(N, NegTimeOut, F)
+ end;
+try_ssh_connect(_N, _NegTimeOut, _F) ->
+ done.
+
+
+oks(L) -> lists:filter(fun({ok,_}) -> true;
+ (_) -> false
+ end, L).
+
%%--------------------------------------------------------------------
save_accepted_host_option(Config) ->
UserDir = proplists:get_value(user_dir, Config),
--
2.26.2