From 6a26bb8d91d61ff9755a9844bd2a5f7ca8ada888 Mon Sep 17 00:00:00 2001 From: Jan Uhlig Date: Tue, 19 Jul 2022 09:43:36 +0200 Subject: Fix stopping unknown listeners --- src/ranch.erl | 27 ++++++++++++++++++--------- test/acceptor_SUITE.erl | 8 +++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/ranch.erl b/src/ranch.erl index c9cc035..dd16f41 100644 --- a/src/ranch.erl +++ b/src/ranch.erl @@ -193,15 +193,24 @@ start_error(_, Error) -> Error. -spec stop_listener(ref()) -> ok | {error, not_found}. stop_listener(Ref) -> - [_, Transport, _, _, _] = ranch_server:get_listener_start_args(Ref), - TransOpts = get_transport_options(Ref), - case supervisor:terminate_child(ranch_sup, {ranch_listener_sup, Ref}) of - ok -> - _ = supervisor:delete_child(ranch_sup, {ranch_listener_sup, Ref}), - ranch_server:cleanup_listener_opts(Ref), - Transport:cleanup(TransOpts); - {error, Reason} -> - {error, Reason} + try + [_, Transport, _, _, _] = ranch_server:get_listener_start_args(Ref), + TransOpts = get_transport_options(Ref), + {Transport, TransOpts} + of + {Transport, TransOpts} -> + case supervisor:terminate_child(ranch_sup, {ranch_listener_sup, Ref}) of + ok -> + _ = supervisor:delete_child(ranch_sup, {ranch_listener_sup, Ref}), + ranch_server:cleanup_listener_opts(Ref), + Transport:cleanup(TransOpts), + ok; + {error, Reason} -> + {error, Reason} + end + catch + error:badarg -> + {error, not_found} end. -spec suspend_listener(ref()) -> ok | {error, any()}. diff --git a/test/acceptor_SUITE.erl b/test/acceptor_SUITE.erl index 851add3..517445b 100644 --- a/test/acceptor_SUITE.erl +++ b/test/acceptor_SUITE.erl @@ -111,7 +111,8 @@ groups() -> misc_set_transport_options, misc_wait_for_connections, misc_multiple_ip_local_socket_opts, - misc_connection_alarms + misc_connection_alarms, + misc_stop_unknown_listener ]}, {supervisor, [ connection_type_supervisor, connection_type_supervisor_separate_from_connection, @@ -659,6 +660,11 @@ do_flush_connection_alarms(Name) -> ok end. +misc_stop_unknown_listener(_) -> + doc("Ensure that stopping an unknown listener returns an error."), + {error, not_found} = ranch:stop_listener(make_ref()), + ok. + %% ssl. ssl_accept_error(_) -> -- cgit v1.2.3