]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: session: Emit an HTTP error if accept fails only for H1 connection
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 17 Jul 2019 14:53:19 +0000 (16:53 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 19 Jul 2019 07:46:23 +0000 (09:46 +0200)
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.

src/session.c

index 0ce1c4e5478d32a7e7b54cd9367b1b5f563946e5..f0f2b71b07cc2dc625a9b7ad5f1205ea142a229b 100644 (file)
@@ -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)