]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: stats: escape some strings in the CSV dump
authorThierry FOURNIER <tfournier@haproxy.com>
Thu, 28 May 2015 14:02:01 +0000 (16:02 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 28 May 2015 15:49:50 +0000 (17:49 +0200)
Some strings which must be dumped in the CSV output can contain one of
the following chars : <,>, <">, or CR/LF. This patch escapes these
strings if the case is encountered.

src/dumpstats.c

index 3f5c069460edd70cda361fca385187955c32f58c..31bc0ba6ca2f54144cc481acb74d8d8ab02af4c4 100644 (file)
@@ -3329,6 +3329,7 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in
                        chunk_appendf(&trash, "<td class=ac>-</td></tr>\n");
        }
        else { /* CSV mode */
+               struct chunk *out = get_trash_chunk();
                static char *srv_hlt_st[SRV_STATS_STATE_COUNT] = {
                        [SRV_STATS_STATE_DOWN]                  = "DOWN,",
                        [SRV_STATS_STATE_DOWN_AGENT]            = "DOWN (agent),",
@@ -3426,7 +3427,7 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in
 
                if (sv->check.state & CHK_ST_ENABLED) {
                        /* check_status */
-                       chunk_appendf(&trash, "%s,", get_check_status_info(sv->check.status));
+                       chunk_appendf(&trash, "%s,", csv_enc(get_check_status_info(sv->check.status), 1, out));
 
                        /* check_code */
                        if (sv->check.status >= HCHK_STATUS_L57DATA)
@@ -3471,8 +3472,8 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in
                chunk_appendf(&trash, "%d,", srv_lastsession(sv));
 
                /* capture of last check and agent statuses */
-               chunk_appendf(&trash, "%s,", ((sv->check.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) ? cstr(sv->check.desc) : "");
-               chunk_appendf(&trash, "%s,", ((sv->agent.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) ? cstr(sv->agent.desc) : "");
+               chunk_appendf(&trash, "%s,", ((sv->check.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) ? csv_enc(cstr(sv->check.desc), 1, out) : "");
+               chunk_appendf(&trash, "%s,", ((sv->agent.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) ? csv_enc(cstr(sv->agent.desc), 1, out) : "");
 
                /* qtime, ctime, rtime, ttime, */
                chunk_appendf(&trash, "%u,%u,%u,%u,",