From 9fb2253aa94cc20581e0afd1a0648cca368b9338 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Sat, 10 Feb 2018 00:06:19 +0100 Subject: [PATCH] mod_stream_mgmt: Abort connection on count error If the client acknowledged more stanzas than the server sent, close the connection with a stream error rather than hiding client bugs by silently adjusting the server's count. --- src/mod_stream_mgmt.erl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index baf72b329..48e7ac985 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -438,11 +438,15 @@ transition_to_pending(State) -> State. -spec check_h_attribute(state(), non_neg_integer()) -> state(). -check_h_attribute(#{mgmt_stanzas_out := NumStanzasOut, jid := JID} = State, H) +check_h_attribute(#{mgmt_stanzas_out := NumStanzasOut, jid := JID, + lang := Lang} = State, H) when H > NumStanzasOut -> - ?DEBUG("~s acknowledged ~B stanzas, but only ~B were sent", - [jid:encode(JID), H, NumStanzasOut]), - mgmt_queue_drop(State#{mgmt_stanzas_out => H}, NumStanzasOut); + ?WARNING_MSG("~s acknowledged ~B stanzas, but only ~B were sent", + [jid:encode(JID), H, NumStanzasOut]), + State1 = State#{mgmt_resend => false}, + Err = xmpp:serr_undefined_condition( + <<"Client acknowledged more stanzas than sent by server">>, Lang), + send(State1, Err); check_h_attribute(#{mgmt_stanzas_out := NumStanzasOut, jid := JID} = State, H) -> ?DEBUG("~s acknowledged ~B of ~B stanzas", [jid:encode(JID), H, NumStanzasOut]),