From 05aab64b06ebf884584150c938f49be22eed6255 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 11 Apr 2019 13:43:57 +0200 Subject: [PATCH] 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. --- src/http_htx.c | 4 ++++ src/htx.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/http_htx.c b/src/http_htx.c index a8c87b766..21a5b57f4 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 de879260a..24e387eed 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; }