diff options
author | Evgeny Khramtsov <xramtsov@gmail.com> | 2014-05-10 00:05:17 +0400 |
---|---|---|
committer | Evgeny Khramtsov <xramtsov@gmail.com> | 2014-05-10 00:05:17 +0400 |
commit | 5d22159e9a4cd7f94e4f0285d78e2ecbcd8a04cf (patch) | |
tree | 8e376db9c362e05cf7bcc3e62ed89c3ef194cdbc | |
parent | Do not try to retreive vCards via local SM for foreign JIDs (diff) | |
parent | XEP-0198: Improve handling of too large 'h' values (diff) |
XEP-0198: Improve handling of incorrect stanza counts reported by client
-rw-r--r-- | src/ejabberd_c2s.erl | 25 |
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} -> |