Package: release.debian.org Severity: normal User: [email protected] Usertags: unblock
Please unblock package ejabberd I would like to upload a new revision on the weekend, fixing an important bug: #711808 The patch for this is attached. No other changes (except changelog) intended. unblock ejabberd/14.07-4
commit d04a500b6cb878aeffa687ce8ae284b386bca62e Author: Holger Weiss <[email protected]> Date: Tue Dec 2 17:39:38 2014 +0100 Avoid hanging c2s processes diff --git a/debian/patches/avoid_hanging_c2s.patch b/debian/patches/avoid_hanging_c2s.patch new file mode 100644 index 0000000..5c16015 --- /dev/null +++ b/debian/patches/avoid_hanging_c2s.patch @@ -0,0 +1,77 @@ +Description: avoid hanging c2s processes + When Stream Management is enabled for a client session and a + gen_tcp:send/2 call fails, make sure that gen_tcp:send/2 won't be + called again. This avoids an Erlang issue where gen_tcp:send/2 blocks + despite 'send_timeout' (and 'send_timeout_close') being set. The patch + has been applied upstream after the 14.07 release. +Author: Holger Weiss <[email protected]> + +diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl +index 1e07be8..2b0f05e 100644 +--- a/src/ejabberd_c2s.erl ++++ b/src/ejabberd_c2s.erl +@@ -1167,9 +1167,7 @@ session_established({xmlstreamerror, _}, StateData) -> + send_element(StateData, ?INVALID_XML_ERR), + send_trailer(StateData), + {stop, normal, StateData}; +-session_established(closed, StateData) +- when StateData#state.mgmt_timeout > 0, +- StateData#state.mgmt_state == active -> ++session_established(closed, #state{mgmt_state = active} = StateData) -> + fsm_next_state(wait_for_resume, StateData); + session_established(closed, StateData) -> + {stop, normal, StateData}. +@@ -1653,8 +1651,7 @@ handle_info({route, From, To, + handle_info({'DOWN', Monitor, _Type, _Object, _Info}, + _StateName, StateData) + when Monitor == StateData#state.socket_monitor -> +- if StateData#state.mgmt_timeout > 0, +- StateData#state.mgmt_state == active orelse ++ if StateData#state.mgmt_state == active; + StateData#state.mgmt_state == pending -> + fsm_next_state(wait_for_resume, StateData); + true -> +@@ -1812,7 +1809,8 @@ send_text(StateData, Text) when StateData#state.mgmt_state == active -> + ?DEBUG("Send XML on stream = ~p", [Text]), + case catch (StateData#state.sockmod):send(StateData#state.socket, Text) of + {'EXIT', _} -> +- (StateData#state.sockmod):close(StateData#state.socket); ++ (StateData#state.sockmod):close(StateData#state.socket), ++ error; + _ -> + ok + end; +@@ -1831,8 +1829,13 @@ send_element(StateData, El) -> + send_stanza(StateData, Stanza) when StateData#state.mgmt_state == pending -> + mgmt_queue_add(StateData, Stanza); + send_stanza(StateData, Stanza) when StateData#state.mgmt_state == active -> +- send_stanza_and_ack_req(StateData, Stanza), +- mgmt_queue_add(StateData, Stanza); ++ NewStateData = case send_stanza_and_ack_req(StateData, Stanza) of ++ ok -> ++ StateData; ++ error -> ++ StateData#state{mgmt_state = pending} ++ end, ++ mgmt_queue_add(NewStateData, Stanza); + send_stanza(StateData, Stanza) -> + send_element(StateData, Stanza), + StateData. +@@ -2429,11 +2432,15 @@ fsm_next_state_gc(StateName, PackedStateData) -> + + %% fsm_next_state: Generate the next_state FSM tuple with different + %% timeout, depending on the future state ++fsm_next_state(session_established, #state{mgmt_state = pending} = StateData) -> ++ fsm_next_state(wait_for_resume, StateData); + fsm_next_state(session_established, StateData) -> + {next_state, session_established, StateData, + ?C2S_HIBERNATE_TIMEOUT}; +-fsm_next_state(wait_for_resume, StateData) +- when StateData#state.mgmt_state /= pending -> ++fsm_next_state(wait_for_resume, #state{mgmt_timeout = 0} = StateData) -> ++ {stop, normal, StateData}; ++fsm_next_state(wait_for_resume, #state{mgmt_pending_since = undefined} = ++ StateData) -> + ?INFO_MSG("Waiting for resumption of stream for ~s", + [jlib:jid_to_string(StateData#state.jid)]), + {next_state, wait_for_resume, diff --git a/debian/patches/series b/debian/patches/series index c1d1b20..e868d4b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -10,3 +10,4 @@ CVE-2014-8760.patch disable_internal_logrotate.patch fix_reopen_log.patch configure_ssl.patch +avoid_hanging_c2s.patch

