BUG/MEDIUM: mux-h2: immediately remove a failed connection from the idle list

If a connection faces an error or a timeout, it must be removed from its
idle list ASAP. We certainly don't want to risk sending new streams on
it.

This should be backported to 2.0 (replacing MT_LIST_DEL with LIST_DEL_LOCKED)
and 1.9 (there's no lock there, the idle lists are per-thread and per-server
however a LIST_DEL_INIT will be needed).

(cherry picked from commit 4481e26e5dd2bc04df494c3f176aa5ceea3d63d5)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 2b87a52..cd92b95 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -3067,6 +3067,17 @@
 			h2_release(h2c);
 			return -1;
 		}
+
+		/* connections in error must be removed from the idle lists */
+		HA_SPIN_LOCK(OTHER_LOCK, &toremove_lock[tid]);
+		LIST_DEL_LOCKED(&conn->list);
+		HA_SPIN_UNLOCK(OTHER_LOCK, &toremove_lock[tid]);
+	}
+	else if (h2c->st0 == H2_CS_ERROR) {
+		/* connections in error must be removed from the idle lists */
+		HA_SPIN_LOCK(OTHER_LOCK, &toremove_lock[tid]);
+		LIST_DEL_LOCKED(&conn->list);
+		HA_SPIN_UNLOCK(OTHER_LOCK, &toremove_lock[tid]);
 	}
 
 	if (!b_data(&h2c->dbuf))
@@ -3164,6 +3175,11 @@
 			offer_buffers(NULL, tasks_run_queue);
 	}
 
+	/* in any case this connection must not be considered idle anymore */
+	HA_SPIN_LOCK(OTHER_LOCK, &toremove_lock[tid]);
+	LIST_DEL_LOCKED(&h2c->conn->list);
+	HA_SPIN_UNLOCK(OTHER_LOCK, &toremove_lock[tid]);
+
 	/* either we can release everything now or it will be done later once
 	 * the last stream closes.
 	 */