aboutsummaryrefslogtreecommitdiff
path: root/src/mod_stream_mgmt.erl
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2020-01-14 01:17:01 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2020-01-14 01:17:01 +0100
commit243dc067338fed42d2f68cfbb4d25356e70c9f4a (patch)
tree9890c1ccdf7a8ab4cf4b56c8ee979676529b9fd0 /src/mod_stream_mgmt.erl
parentmod_carboncopy: Omit check for undefined 'from' (diff)
mod_stream_mgmt: Don't crash on disabled ACK timer
Don't attempt to start an ACK timer if 'ack_timeout' is set to 'infinity'. Thanks to Ingo Jürgensmann for reporting the bug.
Diffstat (limited to 'src/mod_stream_mgmt.erl')
-rw-r--r--src/mod_stream_mgmt.erl16
1 files 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),