From 5bb7a0b0db76a0bf8e96950697650f4b2c07279d Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Thu, 22 Jun 2017 16:58:46 +0300 Subject: [PATCH] Don't let a receiver to crash if a controller is unavailable Fixes #1796 --- src/ejabberd_c2s.erl | 5 ++++- src/ejabberd_s2s_in.erl | 5 ++++- src/ejabberd_s2s_out.erl | 11 +++++++---- src/ejabberd_socket.erl | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 8f374a440..7cbc16f9d 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -67,7 +67,10 @@ start(SockData, Opts) -> case proplists:get_value(supervisor, Opts, true) of true -> - supervisor:start_child(ejabberd_c2s_sup, [SockData, Opts]); + case supervisor:start_child(ejabberd_c2s_sup, [SockData, Opts]) of + {ok, undefined} -> ignore; + Res -> Res + end; _ -> xmpp_stream_in:start(?MODULE, [SockData, Opts], ejabberd_config:fsm_limit_opts(Opts)) diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index 76a844f87..48a650a4e 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -57,7 +57,10 @@ start(SockData, Opts) -> case proplists:get_value(supervisor, Opts, true) of true -> - supervisor:start_child(ejabberd_s2s_in_sup, [SockData, Opts]); + case supervisor:start_child(ejabberd_s2s_in_sup, [SockData, Opts]) of + {ok, undefined} -> ignore; + Res -> Res + end; _ -> xmpp_stream_in:start(?MODULE, [SockData, Opts], ejabberd_config:fsm_limit_opts(Opts)) diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index bcacd8e77..e8cad9792 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -54,10 +54,13 @@ %%%=================================================================== start(From, To, Opts) -> case proplists:get_value(supervisor, Opts, true) of - true -> - supervisor:start_child(ejabberd_s2s_out_sup, - [From, To, Opts]); - _ -> + true -> + case supervisor:start_child(ejabberd_s2s_out_sup, + [From, To, Opts]) of + {ok, undefined} -> ignore; + Res -> Res + end; + _ -> xmpp_stream_out:start(?MODULE, [ejabberd_socket, From, To, Opts], ejabberd_config:fsm_limit_opts([])) end. diff --git a/src/ejabberd_socket.erl b/src/ejabberd_socket.erl index e1712be2f..9953a76ae 100644 --- a/src/ejabberd_socket.erl +++ b/src/ejabberd_socket.erl @@ -87,7 +87,7 @@ %% API %%==================================================================== -spec start(atom(), sockmod(), socket(), [proplists:property()]) - -> {ok, pid() | independent} | {error, inet:posix() | any()}. + -> {ok, pid() | independent} | {error, inet:posix() | any()} | ignore. start(Module, SockMod, Socket, Opts) -> case Module:socket_type() of independent -> {ok, independent}; -- 2.40.0