From 59070e742ad9faabaf908d26f4b8843dc5bc88e8 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 23 Dec 2015 09:33:35 +0100 Subject: BUG: stream_interface: Reuse connection even if the output channel is empty in function 'si_connect', an existing connection is reused (and considered as established) only when there are some pending data in the output channel. This can be problem when filters are used, because a filter can choose to not forward data immediatly. So when we try to initiate a connection to a server, the output channel can be empty. In this situation, if the connection already exists, it is not considered as established and nothing happens. If the stream interface is in the state SI_ST_ASS, this leads to an infinite loop in process_stream because it remains in this state. This patch fixes this problem. Now, in 'si_connect', we always reuse an existing connection, whether or not there are pending data in the output channel. (cherry picked from commit c34d19fc3c2c393e3d7bc80753b338def05a1bca) --- include/proto/stream_interface.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index ed87257..525b6cf 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -362,11 +362,12 @@ static inline int si_connect(struct stream_interface *si) /* we're in the process of establishing a connection */ si->state = SI_ST_CON; } - else if (!channel_is_empty(si_oc(si))) { - /* reuse the existing connection, we'll have to send a - * request there. - */ - conn_data_want_send(conn); + else { + /* reuse the existing connection */ + if (!channel_is_empty(si_oc(si))) { + /* we'll have to send a request there. */ + conn_data_want_send(conn); + } /* the connection is established */ si->state = SI_ST_EST; -- 1.7.12.1