]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: mux_pt: Always set CS_FL_RCV_MORE.
authorOlivier Houchard <ohouchard@haproxy.com>
Tue, 4 Dec 2018 18:17:25 +0000 (19:17 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 4 Dec 2018 18:23:56 +0000 (19:23 +0100)
When using the mux_pt, as we can't know if there's more data to be read,
always set CS_FL_RCV_MORE, and only remove it if we got an error or a shutr
and rcv_buf() returned 0.

src/mux_pt.c

index 349e213929c5397dfa69c08767e356742e2e2027..94824193a1ea74a7d2dfcfa895f5c803fa8f9b11 100644 (file)
@@ -90,6 +90,7 @@ static int mux_pt_init(struct connection *conn, struct proxy *prx)
        }
        conn->mux_ctx = ctx;
        ctx->cs = cs;
+       cs->flags |= CS_FL_RCV_MORE;
        return 0;
 
  fail_free:
@@ -148,6 +149,7 @@ static struct conn_stream *mux_pt_attach(struct connection *conn)
                goto fail;
 
        ctx->cs = cs;
+       cs->flags |= CS_FL_RCV_MORE;
        return (cs);
 fail:
        return NULL;
@@ -207,6 +209,7 @@ static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode)
 {
        if (cs->flags & CS_FL_SHR)
                return;
+       cs->flags &= ~CS_FL_RCV_MORE;
        if (conn_xprt_ready(cs->conn) && cs->conn->xprt->shutr)
                cs->conn->xprt->shutr(cs->conn, (mode == CS_SHR_DRAIN));
        if (cs->flags & CS_FL_SHW)
@@ -246,12 +249,17 @@ static size_t mux_pt_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t
                cs->flags |= CS_FL_RCV_MORE;
                return 0;
        }
-       cs->flags &= ~CS_FL_RCV_MORE;
        ret = cs->conn->xprt->rcv_buf(cs->conn, buf, count, flags);
-       if (conn_xprt_read0_pending(cs->conn))
+       if (conn_xprt_read0_pending(cs->conn)) {
+               if (ret == 0)
+                       cs->flags &= ~CS_FL_RCV_MORE;
                cs->flags |= CS_FL_EOS;
-       if (cs->conn->flags & CO_FL_ERROR)
+       }
+       if (cs->conn->flags & CO_FL_ERROR) {
+               if (ret == 0)
+                       cs->flags &= ~CS_FL_RCV_MORE;
                cs->flags |= CS_FL_ERROR;
+       }
        return ret;
 }