From: Christopher Faulet Date: Wed, 17 Jul 2019 14:53:19 +0000 (+0200) Subject: BUG/MINOR: session: Emit an HTTP error if accept fails only for H1 connection X-Git-Tag: v2.1-dev2~335 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76f4c370f149149c07bf1f88ae10c33c36c458a0;p=thirdparty%2Fhaproxy.git BUG/MINOR: session: Emit an HTTP error if accept fails only for H1 connection If session_accept_fd() fails for a raw HTTP socket, we try to send an HTTP error 500. But, we must also take care it is an HTTP/1 connection. We cannot rely on the mux at this stage, because the error, if any, happens before or during its creation. So, instead, we check if the mux_proto is specified or not. Indeed, the mux h1 cannot be forced on the bind line and there is no ALPN to choose another mux on a raw socket. So if there is no mux_proto defined for a raw HTTP socket, we are sure to have an HTTP/1 connection. This patch must be backported to 2.0 and 1.9. --- diff --git a/src/session.c b/src/session.c index 0ce1c4e547..f0f2b71b07 100644 --- a/src/session.c +++ b/src/session.c @@ -300,7 +300,8 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr conn_free(cli_conn); out_close: listener_release(l); - if (ret < 0 && l->bind_conf->xprt == xprt_get(XPRT_RAW) && p->mode == PR_MODE_HTTP) { + if (ret < 0 && l->bind_conf->xprt == xprt_get(XPRT_RAW) && + p->mode == PR_MODE_HTTP && l->bind_conf->mux_proto == NULL) { /* critical error, no more memory, try to emit a 500 response */ struct buffer *err_msg = &p->errmsg[HTTP_ERR_500]; if (!err_msg->area)