From: Christopher Faulet Date: Thu, 11 Apr 2019 11:43:57 +0000 (+0200) Subject: BUG/MEDIUM: htx: Defrag if blocks position is changed and the payloads wrap X-Git-Tag: v2.0-dev3~310 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=05aab64b06ebf884584150c938f49be22eed6255;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: htx: Defrag if blocks position is changed and the payloads wrap When a header is added or when a data block is added before another one, the blocks position may be changed (but not their payloads position). For instance, when a header is added, we move the block just before the EOH, if any. When the payloads wraps, it is pretty annoying because we loose the last inserted block. It is neither the tail nor the head. And it is not the front either. It is a design problem. Waiting for fixing this problem, we force a defragmentation in such case. Anyway, it should be pretty rare, so it's not really critical. This patch must be backported to 1.9. --- diff --git a/src/http_htx.c b/src/http_htx.c index a8c87b7663..21a5b57f41 100644 --- a/src/http_htx.c +++ b/src/http_htx.c @@ -183,6 +183,10 @@ int http_add_header(struct htx *htx, const struct ist n, const struct ist v) blk = pblk; } + + if (htx_get_blk_pos(htx, blk) != htx->front) + htx_defrag(htx, NULL); + return 1; } diff --git a/src/htx.c b/src/htx.c index de879260a7..24e387eed7 100644 --- a/src/htx.c +++ b/src/htx.c @@ -841,6 +841,10 @@ struct htx_blk *htx_add_data_before(struct htx *htx, const struct htx_blk *ref, break; blk = pblk; } + + if (htx_get_blk_pos(htx, blk) != htx->front) + htx_defrag(htx, NULL); + return blk; }