From: Olivier Houchard Date: Wed, 5 Dec 2018 16:08:55 +0000 (+0100) Subject: BUG/MEDIUM: connections: Reuse an already attached conn_stream. X-Git-Tag: v1.9-dev10~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0fa989f4c02a5af5d511d7bf6776527b4f8e1379;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: connections: Reuse an already attached conn_stream. In connect_server(), if we already have a conn_stream, reuse it instead of trying to create a new one. http_proxy and LUA both manually create a conn_stream and a connection, and we want to use it. --- diff --git a/src/backend.c b/src/backend.c index e62a3b8347..9276fa6b21 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1123,7 +1123,16 @@ int connect_server(struct stream *s) int i; - if (!(s->be->options & PR_O_HTTP_PROXY)) { + /* Some, such as http_proxy and the LUA, create their connection and + * conn_stream manually, so if we already have a conn_stream, try + * to use it. + */ + srv_cs = objt_cs(s->si[1].end); + if (srv_cs) { + old_conn = srv_conn = cs_conn(srv_cs); + if (old_conn) + reuse = 1; + } else { for (i = 0; i < MAX_SRV_LIST; i++) { if (s->sess->srv_list[i].target == s->target) { list_for_each_entry(srv_conn, &s->sess->srv_list[i].list, @@ -1145,16 +1154,6 @@ int connect_server(struct stream *s) } } } - } else { - /* http_proxy is special, we can't just reuse any connection, - * as the destination may be different. We should have created - * a connection and a conn_stream earlier, so get the - * connection from the conn_stream. - */ - srv_cs = objt_cs(s->si[1].end); - old_conn = srv_conn = cs_conn(srv_cs); - if (old_conn) - reuse = 1; } old_conn = srv_conn; @@ -1313,7 +1312,9 @@ int connect_server(struct stream *s) srv->mux_proto)) #endif { - srv_cs = si_alloc_cs(&s->si[1], srv_conn); + srv_cs = objt_cs(s->si[1].end); + if (!srv_cs || srv_cs->conn != srv_conn) + srv_cs = si_alloc_cs(&s->si[1], srv_conn); if (!srv_cs) { conn_free(srv_conn); return SF_ERR_RESOURCE;