]> git.itanic.dy.fi Git - rrdd/commitdiff
rrdtool_update_data: Sanitize input data before passing to rrdtool
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 3 Apr 2011 09:21:16 +0000 (12:21 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 3 Apr 2011 09:21:16 +0000 (12:21 +0300)
If there is any non-numberic data in the input data, replace them with
'U' so that rrdtool doesn't refuse the entire input data set.

Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
rrdtool.c

index cb6022cb8ba820b9b10492caaa0e9f8d8de76d65..b296fee39e14be5d9dc117518980f0941f04cd11 100644 (file)
--- a/rrdtool.c
+++ b/rrdtool.c
@@ -9,6 +9,7 @@
 #include "process.h"
 #include "parser.h"
 #include "debug.h"
+#include "string.h"
 
 #define MAX_ARGS       512
 #define ARGSTR_LEN     32768
@@ -94,9 +95,53 @@ int rrdtool_draw_images(struct rrd_image **image)
        return 0;
 }
 
+static int sanitize_rrd_update_data(char *data)
+{
+       char clean_data[RRD_DATA_MAX_LEN];
+       int entries = 0;
+       char *src, *end, *cln;
+
+       data[RRD_DATA_MAX_LEN - 1] = 0;
+       src = data;
+       cln = clean_data;
+
+       while (src < data + RRD_DATA_MAX_LEN && *src) {
+               if (*src == '-')
+                       src++;
+
+               end = skip_numbers(src);
+
+               if (*end == '.') {
+                       end++;
+                       end = skip_numbers(end);
+               }
+
+               if (*end == ':' || !*end) {
+                       for (; src <= end; src++, cln++)
+                               *cln = *src;
+
+                       goto next;
+               }
+
+               while (*end != ':' && *end)
+                       end++;
+               *cln = 'U';
+               cln++;
+               *cln = ':';
+               cln++;
+       next:
+               end++;
+               src = end;
+               entries++;
+       }
+
+       strncpy(data, clean_data, RRD_DATA_MAX_LEN);
+       return entries;
+}
+
 int rrdtool_update_data(struct rrd_database *rrd)
 {
-       char data[RRD_DATA_MAX_LEN];
+       char data[RRD_DATA_MAX_LEN + 2];
        char cmd[] = RRDTOOL_CMD;
 //     char cmd[] = "echo";
        char *cmdline[] = {
@@ -116,6 +161,7 @@ int rrdtool_update_data(struct rrd_database *rrd)
 
        if (rrd->parse) {
                rrd->parse(data + l, rrd->parser_data);
+               sanitize_rrd_update_data(data + l);
                run(cmd, cmdline);
        }