diff --git a/include/types/proxy.h b/include/types/proxy.h index ca3bc7de2..2d1b88196 100644 --- a/include/types/proxy.h +++ b/include/types/proxy.h @@ -225,7 +225,7 @@ struct error_snapshot { /**** common part ****/ struct timeval when; /* date of this event, (tv_sec == 0) means "never" */ /* @16 */ - char *buf; /* copy of the beginning of the message (may be NULL) */ + void (*show)(struct buffer *, const struct error_snapshot *); /* dump function */ unsigned long long buf_ofs; /* relative position of the buffer's input inside its container */ /* @32 */ unsigned int buf_out; /* pending output bytes _before_ the buffer's input (0..buf->data-1) */ @@ -239,10 +239,10 @@ struct error_snapshot { unsigned int ev_id; /* event number (counter incremented for each capture) */ /* @68: 4 bytes hole here */ struct sockaddr_storage src; /* client's address */ - void (*show)(struct buffer *, const struct error_snapshot *); /* dump function */ /**** protocol-specific part ****/ union error_snapshot_ctx ctx; + char buf[0]; /* copy of the beginning of the message for bufsize bytes */ }; struct email_alert { diff --git a/src/proxy.c b/src/proxy.c index 9f9fec878..0fbfce9c6 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1360,25 +1360,22 @@ void proxy_capture_error(struct proxy *proxy, int is_back, ev_id = HA_ATOMIC_XADD(&error_snapshot_id, 1); - es = malloc(sizeof(*es)); + buf_len = b_data(buf) - buf_out; + + es = malloc(sizeof(*es) + buf_len); if (!es) return; - es->ev_id = ev_id; + es->buf_len = buf_len; + es->ev_id = ev_id; - buf_len = b_data(buf) - buf_out; len1 = b_size(buf) - buf_len; if (len1 > buf_len) len1 = buf_len; - len2 = buf_len - len1; - es->buf_len = buf_len; - - if (!es->buf) - es->buf = malloc(global.tune.bufsize); - - if (es->buf) { + if (len1) { memcpy(es->buf, b_peek(buf, buf_out), len1); + len2 = buf_len - len1; if (len2) memcpy(es->buf + len1, b_orig(buf), len2); } @@ -2119,7 +2116,7 @@ static int cli_io_handler_show_errors(struct appctx *appctx) } /* OK, ptr >= 0, so we have to dump the current line */ - while (es->buf && appctx->ctx.errors.ptr < es->buf_len && appctx->ctx.errors.ptr < global.tune.bufsize) { + while (appctx->ctx.errors.ptr < es->buf_len && appctx->ctx.errors.ptr < global.tune.bufsize) { int newptr; int newline;