BUG/MEDIUM: stream: Be sure to never assign a TCP backend to an HTX stream
With a TCP frontend, it is possible to upgrade a connection to HTTP when the
backend is in HTTP mode. Concretly the upgrade install a new mux. So, once it is
done, the downgrade to TCP is no longer possible. So we must take care to never
assign a TCP backend to a stream on this connection. Otherwise, HAProxy crashes
because raw data from the server are handled as structured data on the client
side.
This patch fixes the issue #420. It must be backported to all versions
supporting the HTX.
diff --git a/src/proxy.c b/src/proxy.c
index 838722d..a5570da 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -1477,6 +1477,14 @@
s->flags |= SF_HTX;
}
}
+ else if (IS_HTX_STRM(s) && be->mode != PR_MODE_HTTP) {
+ /* If a TCP backend is assgiend to an HTX stream, return
+ * an error. It may happens for a new stream on a
+ * previously upgraded connnections. */
+ if (!(s->flags & SF_ERR_MASK))
+ s->flags |= SF_ERR_INTERNAL;
+ return 0;
+ }
/* we may request to parse a request body */
if (be->options & PR_O_WREQ_BODY)