Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2018-02-10 02:06:19 +0300
committerHolger Weiss <holger@zedat.fu-berlin.de>2018-02-10 02:06:19 +0300
commit9fb2253aa94cc20581e0afd1a0648cca368b9338 (patch)
tree587db4019815376386da7e216c01e7935f942992
parent672c2f75d3ebd659c514b0ce1ecc70ecaa99f31f (diff)
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.
-rw-r--r--src/mod_stream_mgmt.erl12
1 files 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]),