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.

(cherry picked from commit eec7f8ac01cb744bc30f50327dd989b4763e0205)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 90f3afd226ac32d8e5d639fd94bfb58407a8bf32)
diff --git a/src/proxy.c b/src/proxy.c
index 0e50680..5a4bc22 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -1507,6 +1507,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;
+		}
 
 		/* If an LB algorithm needs to access some pre-parsed body contents,
 		 * we must not start to forward anything until the connection is