]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: stconn: Properly forward kip to the opposite SE descriptor
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 10 Oct 2025 09:01:19 +0000 (11:01 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 10 Oct 2025 09:01:21 +0000 (11:01 +0200)
By refactoring the HTX to remove the extra field, a bug was introduced in
the stream-connector part. The <kip> (known input payload) value of a sedesc
was moved to <kop> (knwon output payload) using the same sedesc. Of course,
this is totally wrong. <kip> value of a sedesc must be forwarded to the
opposite side.

In addition, the operation is performed in sc_conn_send(). In this function,
we manipulate the stream-connectors. So se_fwd_kip() function was changed to
use the stream-connectors directely.

Now, the function sc_ep_fwd_kip() is now called with the both
stream-connectors to properly forward <kip> from on side to the opposite
side.

The bug is 3.3-specific. No backport needed.

include/haproxy/stconn.h
src/stconn.c

index 3897db6c18208c3f0f064d63035cccef4ad9f80b..61ce17c395af99fb98d42485e497eddbfb318178 100644 (file)
@@ -148,13 +148,14 @@ static inline struct sedesc *se_opposite(struct sedesc *se)
        return seo;
 }
 
-static inline void se_fwd_kip(struct sedesc *se)
+/* stream connector version */
+static inline void sc_ep_fwd_kip(struct stconn *sc_in, struct stconn *sc_out)
 {
-       se->kop += se->kip;
-       se->kip = 0;
+       BUG_ON(sc_in == NULL || sc_out == NULL);
+       sc_out->sedesc->kop += sc_in->sedesc->kip;
+       sc_in->sedesc->kip = 0;
 }
 
-/* stream connector version */
 static forceinline void sc_ep_zero(struct stconn *sc)
 {
        se_fl_zero(sc->sedesc);
index ed5f94e1d73a3dd0d9c3ddfd7f15b33d97fb92e6..a899648f0193e7fd70621456ccf1dbbb4998cb4d 100644 (file)
@@ -1643,7 +1643,7 @@ int sc_conn_send(struct stconn *sc)
        if (!conn->mux)
                return 0;
 
-       se_fwd_kip(sc->sedesc);
+       sc_ep_fwd_kip(sco, sc);
 
        if (sc_ep_have_ff_data(sc)) {
                unsigned int send_flag = 0;