From 7f2c53938cd5f7cedcdad00781dd5a69b897c2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cyril=20Bont=C3=A9?= Date: Sat, 13 Mar 2010 15:15:07 +0100 Subject: [PATCH] [BUG] clf logs segfault when capturing a non existant header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi Willy, Please find a small patch to prevent haproxy segfaulting when logging captured headers in CLF format. Example config to reproduce the bug : listen test :10080 log 127.0.0.1 local7 debug err mode http option httplog clf capture request header NonExistantHeader len 16 -- Cyril Bonté --- src/proto_http.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index fea3d362e6..ad44a2edbc 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -1018,11 +1018,16 @@ void http_sess_clflog(struct session *s) for (hdr = 0; hdr < fe->nb_req_cap; hdr++) { if (h >= sizeof (tmpline) + tmpline - 4) goto trunc; - *(h++) = ' '; - *(h++) = '\"'; - h = encode_string(h, tmpline + sizeof(tmpline) - 2, - '#', hdr_encode_map, txn->req.cap[hdr]); - *(h++) = '\"'; + if (txn->req.cap[hdr] != NULL) { + *(h++) = ' '; + *(h++) = '\"'; + h = encode_string(h, tmpline + sizeof(tmpline) - 2, + '#', hdr_encode_map, txn->req.cap[hdr]); + *(h++) = '\"'; + } else { + memcpy(h, " \"-\"", 4); + h += 4; + } } } @@ -1030,11 +1035,16 @@ void http_sess_clflog(struct session *s) for (hdr = 0; hdr < fe->nb_rsp_cap; hdr++) { if (h >= sizeof (tmpline) + tmpline - 4) goto trunc; - *(h++) = ' '; - *(h++) = '\"'; - h = encode_string(h, tmpline + sizeof(tmpline) - 2, - '#', hdr_encode_map, txn->rsp.cap[hdr]); - *(h++) = '\"'; + if (txn->rsp.cap[hdr] != NULL) { + *(h++) = ' '; + *(h++) = '\"'; + h = encode_string(h, tmpline + sizeof(tmpline) - 2, + '#', hdr_encode_map, txn->rsp.cap[hdr]); + *(h++) = '\"'; + } else { + memcpy(h, " \"-\"", 4); + h += 4; + } } }