[BUG] clf logs segfault when capturing a non existant header
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é
diff --git a/src/proto_http.c b/src/proto_http.c
index fea3d36..ad44a2e 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -1018,11 +1018,16 @@
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 @@
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;
+ }
}
}