]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: htx: prevent <mark> to copy incomplete headers in htx_xfer_blks()
authorWilliam Lallemand <wlallemand@haproxy.com>
Fri, 31 Jan 2025 14:31:00 +0000 (15:31 +0100)
committerWilliam Lallemand <wlallemand@haproxy.com>
Fri, 31 Jan 2025 14:51:51 +0000 (15:51 +0100)
Prevent a partial copy of trailers or headers when using the <mark>
parameter.

When using htx_xfer_blks(), transfering partial headers or trailers are
prevented when restricted by the <count> parameter. However using the
<mark> parameter will still allow to do it.

This patch changes the behavior by checking the <mark> type only after
checking the headers/trailers type, so we can still rollback on partial
transfer.

No impact on the current code, which does not try to do that yet.

src/htx.c

index 105b2ad60380d74855795d15bad75f51116ac0c9..e2a3ccd199bb461714d8fd18a1b6d8d8ff7de97d 100644 (file)
--- a/src/htx.c
+++ b/src/htx.c
@@ -730,12 +730,6 @@ struct htx_ret htx_xfer_blks(struct htx *dst, struct htx *src, uint32_t count,
                        break;
                }
 
-               if (type == mark) {
-                       blk = htx_get_next_blk(src, blk);
-                       srcref = dstref = NULL;
-                       break;
-               }
-
                /* Save <blk> to <srcref> and <dstblk> to <dstref> when we start
                 * to xfer headers or trailers. When EOH/EOT block is reached,
                 * both are reset. It is mandatory to be able to rollback a
@@ -748,6 +742,12 @@ struct htx_ret htx_xfer_blks(struct htx *dst, struct htx *src, uint32_t count,
                }
                else if (type == HTX_BLK_EOH || type == HTX_BLK_EOT)
                        srcref = dstref = NULL;
+
+               /* <mark> allows a copy of the block which matched, then stop */
+               if (type == mark) {
+                       blk = htx_get_next_blk(src, blk);
+                       break;
+               }
        }
 
        if (unlikely(dstref)) {