From 38b203feb1d5c584ed0f93208639445054033b42 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Aug 2025 11:28:39 +0200 Subject: [PATCH 1/3] ejabberd_listener: Use init_fail for errors as recommended by init_ack That is recommended since OTP 26, see https://www.erlang.org/doc/apps/stdlib/proc_lib.html#init_ack/2 Warning Do not use this function to return an error indicating that the process start failed. When doing so the start function can return before the failing process has exited, which may block VM resources required for a new start attempt to succeed. Use init_fail/2,3 for that purpose. --- src/ejabberd_listener.erl | 46 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index f82b1e05b..5528b3a7f 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -139,16 +139,13 @@ init({Port, _, udp} = EndPoint, Module, Opts, SockOpts) -> {error, _} -> ok end; - {error, Reason} = Err -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err) + {error, Reason} -> + return_socket_error(Reason, EndPoint, Module) end; - {{error, Reason} = Err, _} -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err); - {_, {error, Reason} = Err} -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err) + {{error, Reason}, _} -> + return_socket_error(Reason, EndPoint, Module); + {_, {error, Reason} } -> + return_socket_error(Reason, EndPoint, Module) end; init({Port, _, tcp} = EndPoint, Module, Opts, SockOpts) -> case {listen_tcp(Port, SockOpts), @@ -177,16 +174,13 @@ init({Port, _, tcp} = EndPoint, Module, Opts, SockOpts) -> {error, _} -> ok end; - {error, Reason} = Err -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err) + {error, Reason} -> + return_socket_error(Reason, EndPoint, Module) end; - {{error, Reason}, _} = Err -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err); - {_, {error, Reason}} = Err -> - report_socket_error(Reason, EndPoint, Module), - proc_lib:init_ack(Err) + {{error, Reason}, _} -> + return_socket_error(Reason, EndPoint, Module); + {_, {error, Reason}} -> + return_socket_error(Reason, EndPoint, Module) end. -spec listen_tcp(inet:port_number(), [gen_tcp:option()]) -> @@ -608,10 +602,20 @@ config_reloaded() -> end end, New). --spec report_socket_error(inet:posix(), endpoint(), module()) -> ok. -report_socket_error(Reason, EndPoint, Module) -> + +-spec return_socket_error(inet:posix(), endpoint(), module()) -> ok. +return_socket_error(Reason, EndPoint, Module) -> ?ERROR_MSG("Failed to open socket at ~ts for ~ts: ~ts", - [format_endpoint(EndPoint), Module, format_error(Reason)]). + [format_endpoint(EndPoint), Module, format_error(Reason)]), + return_init_error(Reason). + +-ifdef(OTP_BELOW_26). +return_init_error(Reason) -> + proc_lib:init_ack({error, Reason}). +-else. +return_init_error(Reason) -> + proc_lib:init_fail({error, Reason}, {exit, normal}). +-endif. -spec format_error(inet:posix() | atom()) -> string(). format_error(Reason) -> From e1dc686ae78251f08813ca17e8642d1aeb281f2f Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Aug 2025 15:12:41 +0200 Subject: [PATCH 2/3] mod_conversejs: Ensure assets_path ends in / as required by Converse (#4414) --- src/mod_conversejs.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mod_conversejs.erl b/src/mod_conversejs.erl index 280bd8088..f6462e584 100644 --- a/src/mod_conversejs.erl +++ b/src/mod_conversejs.erl @@ -69,7 +69,7 @@ process([], #request{method = 'GET', host = Host, q = Query, raw_path = RawPath1 {<<"default_domain">>, Domain}, {<<"domain_placeholder">>, Domain}, {<<"registration_domain">>, Domain}, - {<<"assets_path">>, RawPath}, + {<<"assets_path">>, <>}, {<<"view_mode">>, <<"fullscreen">>} | ExtraOptions], Init2 = From 3183e2f7337f9fa1f016f99bd3cf5d0619ee161b Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 15 Aug 2025 16:32:54 +0200 Subject: [PATCH 3/3] Fix dialyzer warnings in recent commit --- src/ejabberd_listener.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_listener.erl b/src/ejabberd_listener.erl index 5528b3a7f..9f0f5a162 100644 --- a/src/ejabberd_listener.erl +++ b/src/ejabberd_listener.erl @@ -602,8 +602,7 @@ config_reloaded() -> end end, New). - --spec return_socket_error(inet:posix(), endpoint(), module()) -> ok. +-spec return_socket_error(inet:posix(), endpoint(), module()) -> no_return(). return_socket_error(Reason, EndPoint, Module) -> ?ERROR_MSG("Failed to open socket at ~ts for ~ts: ~ts", [format_endpoint(EndPoint), Module, format_error(Reason)]), @@ -613,6 +612,7 @@ return_socket_error(Reason, EndPoint, Module) -> return_init_error(Reason) -> proc_lib:init_ack({error, Reason}). -else. +-spec return_init_error(inet:posix()) -> no_return(). return_init_error(Reason) -> proc_lib:init_fail({error, Reason}, {exit, normal}). -endif.