From: Willy Tarreau Date: Sun, 12 Dec 2010 12:09:08 +0000 (+0100) Subject: [MINOR] http: support wrapping messages in error captures X-Git-Tag: v1.5-dev8~350 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=81f2fb97fe92f3b912309fc067ab64363055d4ff;p=thirdparty%2Fhaproxy.git [MINOR] http: support wrapping messages in error captures Error captures did only support contiguous messages. This is annoying for capturing chunking errors, so let's ensure the function is able to copy wrapped messages. --- diff --git a/src/proto_http.c b/src/proto_http.c index 670ecd1180..2c33a84ce6 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -7222,12 +7222,25 @@ void http_capture_bad_message(struct error_snapshot *es, struct session *s, struct buffer *buf, struct http_msg *msg, int state, struct proxy *other_end) { - es->len = buf->r - (buf->data + msg->som); - memcpy(es->buf, buf->data + msg->som, MIN(es->len, sizeof(es->buf))); + if (buf->r <= (buf->data + msg->som)) { /* message wraps */ + int len1 = buf->size - msg->som; + es->len = buf->r - (buf->data + msg->som) + buf->size; + memcpy(es->buf, buf->data + msg->som, MIN(len1, sizeof(es->buf))); + if (es->len > len1 && len1 < sizeof(es->buf)) + memcpy(es->buf, buf->data, MIN(es->len, sizeof(es->buf)) - len1); + } + else { + es->len = buf->r - (buf->data + msg->som); + memcpy(es->buf, buf->data + msg->som, MIN(es->len, sizeof(es->buf))); + } + if (msg->err_pos >= 0) es->pos = msg->err_pos - msg->som; - else + else if (buf->lr >= (buf->data + msg->som)) es->pos = buf->lr - (buf->data + msg->som); + else + es->pos = buf->lr - (buf->data + msg->som) + buf->size; + es->when = date; // user-visible date es->sid = s->uniq_id; es->srv = s->srv;