--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
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 <holger@zedat.fu-berlin.de>
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 <holger@zedat.fu-berlin.de>
+
+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
--- End Message ---