From 243dc067338fed42d2f68cfbb4d25356e70c9f4a Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 14 Jan 2020 01:17:01 +0100 Subject: [PATCH] mod_stream_mgmt: Don't crash on disabled ACK timer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't attempt to start an ACK timer if 'ack_timeout' is set to 'infinity'. Thanks to Ingo Jürgensmann for reporting the bug. --- src/mod_stream_mgmt.erl | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index 63254bcac..dd844879a 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -494,11 +494,10 @@ update_num_stanzas_in(State, _El) -> send_rack(#{mgmt_ack_timer := _} = State) -> State; send_rack(#{mgmt_xmlns := Xmlns, - mgmt_stanzas_out := NumStanzasOut, - mgmt_ack_timeout := AckTimeout} = State) -> - TRef = erlang:start_timer(AckTimeout, self(), ack_timeout), - State1 = State#{mgmt_ack_timer => TRef, mgmt_stanzas_req => NumStanzasOut}, - send(State1, #sm_r{xmlns = Xmlns}). + mgmt_stanzas_out := NumStanzasOut} = State) -> + State1 = State#{mgmt_stanzas_req => NumStanzasOut}, + State2 = start_ack_timer(State1), + send(State2, #sm_r{xmlns = Xmlns}). -spec resend_rack(state()) -> state(). resend_rack(#{mgmt_ack_timer := _, @@ -713,6 +712,13 @@ restart_pending_timer(#{mgmt_pending_timer := TRef} = State, NewTimeout) -> restart_pending_timer(State, _NewTimeout) -> State. +-spec start_ack_timer(state()) -> state(). +start_ack_timer(#{mgmt_ack_timeout := infinity} = State) -> + State; +start_ack_timer(#{mgmt_ack_timeout := AckTimeout} = State) -> + TRef = erlang:start_timer(AckTimeout, self(), ack_timeout), + State#{mgmt_ack_timer => TRef}. + -spec cancel_ack_timer(state()) -> state(). cancel_ack_timer(#{mgmt_ack_timer := TRef} = State) -> misc:cancel_timer(TRef),