From 6fe60182aa150deec7fd367ad4b574d38dc80356 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 7 Jan 2010 13:35:21 +0100 Subject: [PATCH] [BUG] http: memory leak with captures when using keep-alive Hank A. Paulson reported a massive memory leak when using keep-alive mode. The information he provided made it easy to find that captured request and response headers were erased but not released when renewing a request. --- src/proto_http.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index 12647df23..9b9176cae 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -6310,11 +6310,19 @@ void http_init_txn(struct session *s) if (fe->options2 & PR_O2_REQBUG_OK) txn->req.err_pos = -1; /* let buggy requests pass */ - if (txn->req.cap) + if (txn->req.cap) { + struct cap_hdr *h; + for (h = fe->req_cap; h; h = h->next) + pool_free2(h->pool, txn->req.cap[h->index]); memset(txn->req.cap, 0, fe->nb_req_cap * sizeof(void *)); + } - if (txn->rsp.cap) + if (txn->rsp.cap) { + struct cap_hdr *h; + for (h = fe->rsp_cap; h; h = h->next) + pool_free2(h->pool, txn->rsp.cap[h->index]); memset(txn->rsp.cap, 0, fe->nb_rsp_cap * sizeof(void *)); + } if (txn->hdr_idx.v) hdr_idx_init(&txn->hdr_idx);