]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: applet: Properly handle receives of size 0
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 21 May 2026 14:16:04 +0000 (16:16 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 22 May 2026 06:45:57 +0000 (08:45 +0200)
when appctx_rcv_buf() function was called to get data from the applet, but
to get zero bytes, nothing was performed and the function early
returned. However, we must at least take care to set SE_FL_WANT_ROOM if
necessary. Otherwise, if data are still blocked in the applet's output
buffer while the EOI/EOS are pending, the information can be reported to the
upper layer and remaining data can be lost.

Indeed, in such case, SE_FL_WANT_ROOM flag is here to specify the applet has
more data to deliver. Thanks to this flag, the stream will wait before
closing. But when appctx_rcv_buf() function is called, this flag is removed by
the stconn. It is the function responsibility to set it again when necessary.

This patch should fix second part of the issue #3366. It must be backported
to 3.0.

src/applet.c

index e1ec9b83778909280b9cf59aede8198926750d2c..d93720ec9c95ffa5dd164952e88697952aaf8546 100644 (file)
@@ -539,9 +539,6 @@ size_t appctx_rcv_buf(struct stconn *sc, struct buffer *buf, size_t count, unsig
        if (applet_fl_test(appctx, APPCTX_FL_OUTBLK_ALLOC))
                goto end;
 
-       if (!count)
-               goto end;
-
        if (!appctx_get_buf(appctx, &appctx->outbuf)) {
                TRACE_STATE("waiting for appctx outbuf allocation", APPLET_EV_RECV|APPLET_EV_BLK, appctx);
                goto end;
@@ -550,7 +547,8 @@ size_t appctx_rcv_buf(struct stconn *sc, struct buffer *buf, size_t count, unsig
        if (flags & CO_RFL_BUF_FLUSH)
                applet_fl_set(appctx, APPCTX_FL_FASTFWD);
 
-       ret = CALL_APPLET_WITH_RET(appctx->applet, rcv_buf(appctx, buf, count, flags));
+       if (count)
+               ret = CALL_APPLET_WITH_RET(appctx->applet, rcv_buf(appctx, buf, count, flags));
        if (ret)
                applet_fl_clr(appctx, APPCTX_FL_OUTBLK_FULL);