diff options
| author | Hans Nilsson <[email protected]> | 2018-06-01 10:49:45 +0200 | 
|---|---|---|
| committer | Hans Nilsson <[email protected]> | 2018-06-01 10:49:45 +0200 | 
| commit | c08d7b0e61f3763726c0d6564d57fab195026b0b (patch) | |
| tree | e41c7c958081518dad7ba408e772f17e862b3afd /lib/ssh/src | |
| parent | 2f19f05194950b45e31cc3f6988f1379a10173e4 (diff) | |
| parent | d3b29633d42df9dd7d8a2f09d5b0c98f637fbacd (diff) | |
| download | otp-c08d7b0e61f3763726c0d6564d57fab195026b0b.tar.gz otp-c08d7b0e61f3763726c0d6564d57fab195026b0b.tar.bz2 otp-c08d7b0e61f3763726c0d6564d57fab195026b0b.zip | |
Merge branch 'hans/ssh/channel_polish/OTP-15083'
* hans/ssh/channel_polish/OTP-15083:
  ssh: Better crash report for bad channel callback module
Diffstat (limited to 'lib/ssh/src')
| -rw-r--r-- | lib/ssh/src/ssh_client_channel.erl | 2 | ||||
| -rw-r--r-- | lib/ssh/src/ssh_connection.erl | 42 | 
2 files changed, 25 insertions, 19 deletions
| diff --git a/lib/ssh/src/ssh_client_channel.erl b/lib/ssh/src/ssh_client_channel.erl index 134d3f08bd..8b5e196412 100644 --- a/lib/ssh/src/ssh_client_channel.erl +++ b/lib/ssh/src/ssh_client_channel.erl @@ -180,6 +180,8 @@ init([Options]) ->  	{stop, Why} ->  	    {stop, Why}      catch  +        _:undef -> +            {stop, {bad_channel_callback_module,Cb}};  	_:Reason ->  	    {stop, Reason}      end. diff --git a/lib/ssh/src/ssh_connection.erl b/lib/ssh/src/ssh_connection.erl index ed03b4e2ed..dad7636e3f 100644 --- a/lib/ssh/src/ssh_connection.erl +++ b/lib/ssh/src/ssh_connection.erl @@ -498,25 +498,24 @@ handle_msg(#ssh_msg_channel_request{recipient_channel = ChannelId,  				    data = Data},  	   #connection{channel_cache = Cache} = Connection, server) ->      <<?DEC_BIN(SsName,_SsLen)>> = Data, -     -    #channel{remote_id = RemoteId} = Channel0 =  +    #channel{remote_id=RemoteId} = Channel =   	ssh_client_channel:cache_lookup(Cache, ChannelId),  -     -    ReplyMsg =  {subsystem, ChannelId, WantReply, binary_to_list(SsName)}, -     -    try -	{ok, Pid} = start_subsystem(SsName, Connection, Channel0, ReplyMsg), -	erlang:monitor(process, Pid), -	Channel = Channel0#channel{user = Pid}, -	ssh_client_channel:cache_update(Cache, Channel), -	Reply = {connection_reply, -		 channel_success_msg(RemoteId)}, -	{[Reply], Connection} -    catch -	_:_ -> -	    ErrorReply = {connection_reply, channel_failure_msg(RemoteId)}, -	    {[ErrorReply], Connection} -    end;	 +    Reply = +        try +            start_subsystem(SsName, Connection, Channel, +                            {subsystem, ChannelId, WantReply, binary_to_list(SsName)}) +        of +            {ok, Pid} -> +                erlang:monitor(process, Pid), +                ssh_client_channel:cache_update(Cache, Channel#channel{user=Pid}), +                channel_success_msg(RemoteId); +            {error,_Error} -> +                channel_failure_msg(RemoteId) +        catch +            _:_ -> +                channel_failure_msg(RemoteId) +        end, +    {[{connection_reply,Reply}], Connection};  handle_msg(#ssh_msg_channel_request{request_type = "subsystem"},  	   Connection, client) -> @@ -822,7 +821,12 @@ start_channel(Cb, Id, Args, SubSysSup, Exec, Opts) ->      ChannelSup = ssh_subsystem_sup:channel_supervisor(SubSysSup),      case max_num_channels_not_exceeded(ChannelSup, Opts) of          true -> -            ssh_server_channel_sup:start_child(ChannelSup, Cb, Id, Args, Exec); +            case ssh_server_channel_sup:start_child(ChannelSup, Cb, Id, Args, Exec) of +                {error,{Error,_Info}} -> +                    throw(Error); +                Others -> +                    Others +            end;          false ->  	    throw(max_num_channels_exceeded)      end. | 
