]> arthur.barton.de Git - netdata.git/commitdiff
escape chart titles to have proper JSON formatted output; fixes #1390
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Fri, 16 Dec 2016 19:56:45 +0000 (21:56 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Fri, 16 Dec 2016 19:56:45 +0000 (21:56 +0200)
src/common.c
src/common.h
src/rrd.c

index 24aa4af60a47ab6b8180bf62793a0a4c51fc1bc2..78e5896e98babc1ef91f67630256a2128ce7d6d4 100644 (file)
@@ -197,6 +197,21 @@ void freez(void *ptr) {
     free(ptr);
 }
 
+void json_escape_string(char *dst, const char *src, size_t size) {
+    const char *t;
+    char *d = dst, *e = &dst[size - 1];
+
+    for(t = src; *t && d < e ;t++) {
+        if(unlikely(*t == '\\' || *t == '"')) {
+            if(unlikely(d + 1 >= e)) break;
+            *d++ = '\\';
+        }
+        *d++ = *t;
+    }
+
+    *d = '\0';
+}
+
 int sleep_usec(usec_t usec) {
 
 #ifndef NETDATA_WITH_USLEEP
index 5efb788aebbb65f641328b756eba6833bd676329..c92c0496b3ad89bd78e218ab3a80ac5a17893c27 100644 (file)
@@ -181,6 +181,8 @@ extern void *reallocz(void *ptr, size_t size);
 extern void freez(void *ptr);
 #endif
 
+extern void json_escape_string(char *dst, const char *src, size_t size);
+
 extern void *mymmap(const char *filename, size_t size, int flags, int ksm);
 extern int savememory(const char *filename, void *mem, size_t size);
 
index f24602e3934306cd6a291ecb5d3db5d36e35ad0a..40bf08aabc524250d06a0fcdb577127edef3088e 100644 (file)
--- a/src/rrd.c
+++ b/src/rrd.c
@@ -609,8 +609,10 @@ RRDSET *rrdset_create(const char *type, const char *id, const char *name, const
 
     {
         char varvalue[CONFIG_MAX_VALUE + 1];
+        char varvalue2[CONFIG_MAX_VALUE + 1];
         snprintfz(varvalue, CONFIG_MAX_VALUE, "%s (%s)", title?title:"", st->name);
-        st->title = config_get(st->id, "title", varvalue);
+        json_escape_string(varvalue2, varvalue, sizeof(varvalue2));
+        st->title = config_get(st->id, "title", varvalue2);
     }
 
     st->rrdfamily = rrdfamily_create(st->family);