BUG/MEDIUM: mux-h1: Always set CS_FL_EOI for response in MSG_DONE state
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 8 Feb 2021 16:18:01 +0000 (17:18 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 22 Feb 2021 09:23:24 +0000 (10:23 +0100)
During the message parsing, if in MSG_DONE state, the CS_FL_EOI flag must
always be set on the conn-stream if following conditions are met :

  * It is a response or
  * It is a request but not a protocol upgrade nor a CONNECT.

For now, there is no test on the message type (request or response). Thus
the CS_FL_EOI flag is not set for a response with a "Connection: upgrade"
header but not a 101 response.

This bug was introduced by the commit 3e1748bbf ("BUG/MINOR: mux-h1: Don't
set CS_FL_EOI too early for protocol upgrade requests"). It was backported
as far as 2.0. Thus, this patch must also be backported as far as 2.0.

(cherry picked from commit a22782b597ee9a3bfecb18a66e29633c8e814216)
[cf: context adjustments]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/mux_h1.c

index 94006e6..0c1a06a 100644 (file)
@@ -1410,10 +1410,14 @@ static size_t h1_process_eom(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
        }
 
        h1s->flags |= H1S_F_PARSING_DONE;
-       /* Don't set EOI on the conn-stream for protocol upgrade requests, wait
-        * the response to do so or not depending on the status code.
-        */
-       if (!(h1m->flags & H1_MF_CONN_UPG))
+       /* Set EOI on conn-stream in DONE state iff:
+        *  - it is a response
+        *  - it is a request but no a protocol upgrade nor a CONNECT
+        *
+        * If not set, Wait the response to do so or not depending on the status
+         * code.
+         */
+       if ((h1m->flags & H1_MF_RESP) || ((h1s->meth != HTTP_METH_CONNECT) && !(h1m->flags & H1_MF_CONN_UPG)))
                h1s->cs->flags |= CS_FL_EOI;
   end:
        TRACE_LEAVE(H1_EV_RX_DATA|H1_EV_RX_EOI, h1s->h1c->conn, h1s, 0, (size_t[]){ret});