]> granicus.if.org Git - ejabberd/commitdiff
mod_stream_mgmt: Abort connection on count error
authorHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 9 Feb 2018 23:06:19 +0000 (00:06 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 9 Feb 2018 23:06:19 +0000 (00:06 +0100)
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

index baf72b329de3d4f26306dad8e97b5edf6b44c10e..48e7ac985fd08dd88c4bf84b91b22e2963e270a2 100644 (file)
@@ -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]),