aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Khramtsov <xramtsov@gmail.com>2014-05-10 00:05:17 +0400
committerEvgeny Khramtsov <xramtsov@gmail.com>2014-05-10 00:05:17 +0400
commit5d22159e9a4cd7f94e4f0285d78e2ecbcd8a04cf (patch)
tree8e376db9c362e05cf7bcc3e62ed89c3ef194cdbc
parentDo not try to retreive vCards via local SM for foreign JIDs (diff)
parentXEP-0198: Improve handling of too large 'h' values (diff)
Merge pull request #205 from weiss/xep-019814.05
XEP-0198: Improve handling of incorrect stanza counts reported by client
-rw-r--r--src/ejabberd_c2s.erl25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 8874c48ad..9ce66d043 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -2686,16 +2686,13 @@ handle_r(StateData) ->
send_element(StateData, Res),
StateData.
-handle_a(#state{jid = JID, mgmt_stanzas_out = NumStanzasOut} = StateData,
- Attrs) ->
+handle_a(StateData, Attrs) ->
case catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs)) of
H when is_integer(H), H >= 0 ->
- ?DEBUG("~s acknowledged ~B of ~B stanzas",
- [jlib:jid_to_string(JID), H, NumStanzasOut]),
- mgmt_queue_drop(StateData, H);
+ check_h_attribute(StateData, H);
_ ->
- ?WARNING_MSG("Ignoring invalid ACK element from ~s",
- [jlib:jid_to_string(JID)]),
+ ?DEBUG("Ignoring invalid ACK element from ~s",
+ [jlib:jid_to_string(StateData#state.jid)]),
StateData
end.
@@ -2707,7 +2704,7 @@ handle_resume(StateData, Attrs) ->
case {xml:get_attr(<<"previd">>, Attrs),
catch jlib:binary_to_integer(xml:get_attr_s(<<"h">>, Attrs))}
of
- {{value, PrevID}, H} when is_integer(H) ->
+ {{value, PrevID}, H} when is_integer(H), H >= 0 ->
case inherit_session_state(StateData, PrevID) of
{ok, InheritedState} ->
{ok, InheritedState, H};
@@ -2728,7 +2725,7 @@ handle_resume(StateData, Attrs) ->
end,
case R of
{ok, ResumedState, NumHandled} ->
- NewState = mgmt_queue_drop(ResumedState, NumHandled),
+ NewState = check_h_attribute(ResumedState, NumHandled),
AttrXmlns = NewState#state.mgmt_xmlns,
AttrId = make_resume_id(NewState),
AttrH = jlib:integer_to_binary(NewState#state.mgmt_stanzas_in),
@@ -2754,6 +2751,16 @@ handle_resume(StateData, Attrs) ->
error
end.
+check_h_attribute(#state{mgmt_stanzas_out = NumStanzasOut} = StateData, H)
+ when H > NumStanzasOut ->
+ ?DEBUG("~s acknowledged ~B stanzas, but only ~B were sent",
+ [jlib:jid_to_string(StateData#state.jid), H, NumStanzasOut]),
+ mgmt_queue_drop(StateData#state{mgmt_stanzas_out = H}, NumStanzasOut);
+check_h_attribute(#state{mgmt_stanzas_out = NumStanzasOut} = StateData, H) ->
+ ?DEBUG("~s acknowledged ~B of ~B stanzas",
+ [jlib:jid_to_string(StateData#state.jid), H, NumStanzasOut]),
+ mgmt_queue_drop(StateData, H).
+
update_num_stanzas_in(#state{mgmt_state = active} = StateData, El) ->
NewNum = case {is_stanza(El), StateData#state.mgmt_stanzas_in} of
{true, 4294967295} ->