Skip to content

Commit

Permalink
Merge branch 'ia/ssh/shutdown-bug' into maint
Browse files Browse the repository at this point in the history
* ia/ssh/shutdown-bug:
  ssh:close/1 will no longer crash if ssl manager already happens to have been terminated.
  • Loading branch information
IngelaAndin committed Mar 26, 2012
2 parents 158b774 + a06cd04 commit 2c8eec6
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 14 deletions.
22 changes: 9 additions & 13 deletions lib/ssh/src/ssh_connection_manager.erl
Expand Up @@ -144,27 +144,21 @@ adjust_window(ConnectionManager, Channel, Bytes) ->
cast(ConnectionManager, {adjust_window, Channel, Bytes}).

close(ConnectionManager, ChannelId) ->
try call(ConnectionManager, {close, ChannelId}) of
ok ->
case call(ConnectionManager, {close, ChannelId}) of
ok ->
ok;
{error, channel_closed} ->
ok
catch
exit:{noproc, _} ->
{error, channel_closed} ->
ok
end.
end.

stop(ConnectionManager) ->
try call(ConnectionManager, stop) of
case call(ConnectionManager, stop) of
ok ->
ok;
{error, channel_closed} ->
ok
catch
exit:{noproc, _} ->
ok
end.

send(ConnectionManager, ChannelId, Type, Data, Timeout) ->
call(ConnectionManager, {data, ChannelId, Type, Data}, Timeout).

Expand Down Expand Up @@ -591,7 +585,9 @@ call(Pid, Msg, Timeout) ->
catch
exit:{timeout, _} ->
{error, timeout};
exit:{normal, _} ->
exit:{normal} ->
{error, channel_closed};
exit:{{shutdown, _}, _} ->
{error, channel_closed};
exit:{noproc,_} ->
{error, channel_closed}
Expand Down
30 changes: 29 additions & 1 deletion lib/ssh/test/ssh_basic_SUITE.erl
Expand Up @@ -110,7 +110,8 @@ all() ->
{group, rsa_pass_key},
{group, internal_error},
daemon_already_started,
server_password_option, server_userpassword_option].
server_password_option, server_userpassword_option,
close].

groups() ->
[{dsa_key, [], [exec, exec_compressed, shell, known_hosts]},
Expand Down Expand Up @@ -507,7 +508,34 @@ internal_error(Config) when is_list(Config) ->
{user_dir, UserDir},
{user_interaction, false}]).

%%--------------------------------------------------------------------
close(doc) ->
["Simulate that we try to close an already closed connection"];

close(suite) ->
[];

close(Config) when is_list(Config) ->
SystemDir = ?config(data_dir, Config),
PrivDir = ?config(priv_dir, Config),
UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
file:make_dir(UserDir),

{_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
{user_dir, UserDir},
{user_passwords, [{"vego", "morot"}]},
{failfun, fun ssh_test_lib:failfun/2}]),
{ok, CM} = ssh:connect(Host, Port, [{silently_accept_hosts, true},
{user_dir, UserDir},
{user, "vego"},
{password, "morot"},
{user_interaction, false}]),

exit(CM, {shutdown, normal}),
ok = ssh:close(CM).



%%--------------------------------------------------------------------
%% Internal functions
%%--------------------------------------------------------------------

0 comments on commit 2c8eec6

Please sign in to comment.