From: Willy Tarreau Date: Thu, 7 Jan 2010 12:35:21 +0000 (+0100) Subject: [BUG] http: memory leak with captures when using keep-alive X-Git-Tag: v1.4-dev6~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6fe60182aa150deec7fd367ad4b574d38dc80356;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/src/proto_http.c b/src/proto_http.c index 12647df230..9b9176caea 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);