From: Christopher Faulet Date: Tue, 9 May 2023 09:44:56 +0000 (+0200) Subject: MEDIUM: stconn: Be sure to always be able to unblock a SC that needs room X-Git-Tag: v2.8-dev11~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e59f7583ee9952a101f0430992add3fdff4db2ae;p=thirdparty%2Fhaproxy.git MEDIUM: stconn: Be sure to always be able to unblock a SC that needs room When sc_need_room() is called, the caller cannot request more free space than a minimum value to be sure it is always possible to unblock it. it is a safety guard to not freeze any SC on NEED_ROOM condition. At worse it will lead to some wakeups un excess at the edge. To keep things simple, the following minimum is used: (global.tune.bufsize - global.tune.maxrewrite - sizeof(struct htx)) --- diff --git a/include/haproxy/stconn.h b/include/haproxy/stconn.h index acc22977b9..97460c7c5d 100644 --- a/include/haproxy/stconn.h +++ b/include/haproxy/stconn.h @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -444,12 +445,13 @@ static inline void sc_have_room(struct stconn *sc) * SE_FL_HAVE_NO_DATA to be called again as soon as SC_FL_NEED_ROOM is cleared. * * The caller is responsible to specified the amount of free space required to - * progress. + * progress. However, to be sure the SC can be unblocked a max value cannot be + * eceeded : (BUFSIZE - RESERVE - HTX OVERHEAD) */ static inline void sc_need_room(struct stconn *sc, ssize_t room_needed) { sc->flags |= SC_FL_NEED_ROOM; - sc->room_needed = room_needed; + sc->room_needed = MIN(global.tune.bufsize - global.tune.maxrewrite - sizeof(struct htx), room_needed); } /* The stream endpoint indicates that it's ready to consume data from the