f04c66a
diff -up rrdtool-1.4.8/src/rrd_graph.c.orig2 rrdtool-1.4.8/src/rrd_graph.c
f04c66a
--- rrdtool-1.4.8/src/rrd_graph.c.orig2	2013-05-23 09:55:07.000000000 +0200
f04c66a
+++ rrdtool-1.4.8/src/rrd_graph.c	2013-06-03 15:56:35.820593192 +0200
f04c66a
@@ -4022,6 +4022,12 @@ rrd_info_t *rrd_graph_v(
f04c66a
         char     *path;
f04c66a
         char     *filename;
f04c66a
 
f04c66a
+        if (bad_format_imginfo(im.imginfo)) {
f04c66a
+            rrd_info_free(im.grinfo);
f04c66a
+            im_free(&im);
f04c66a
+            rrd_set_error("bad format for imginfo");
f04c66a
+            return NULL;
f04c66a
+        }
f04c66a
         path = strdup(im.graphfile);
f04c66a
         filename = basename(path);
f04c66a
         info.u_str =
f04c66a
@@ -4827,6 +4833,51 @@ int bad_format(
f04c66a
 }
f04c66a
 
f04c66a
 
f04c66a
+int bad_format_imginfo(
f04c66a
+    char *fmt)
f04c66a
+{
f04c66a
+    char     *ptr;
f04c66a
+    int       n = 0;
f04c66a
+
f04c66a
+    ptr = fmt;
f04c66a
+    while (*ptr != '\0')
f04c66a
+        if (*ptr++ == '%') {
f04c66a
+
f04c66a
+            /* line cannot end with percent char */
f04c66a
+            if (*ptr == '\0')
f04c66a
+                return 1;
f04c66a
+            /* '%%' is allowed */
f04c66a
+            if (*ptr == '%')
f04c66a
+                ptr++;
f04c66a
+            /* '%s', '%S' are allowed */
f04c66a
+            else if (*ptr == 's' || *ptr == 'S') {
f04c66a
+                n = 1;
f04c66a
+                ptr++;
f04c66a
+            }
f04c66a
+
f04c66a
+            /* or else '% 4lu' and such are allowed */
f04c66a
+            else {
f04c66a
+                /* optional padding character */
f04c66a
+                if (*ptr == ' ')
f04c66a
+                    ptr++;
f04c66a
+                /* This should take care of 'm' */
f04c66a
+                while (*ptr >= '0' && *ptr <= '9')
f04c66a
+                    ptr++;
f04c66a
+                /* 'lu' must follow here */
f04c66a
+                if (*ptr++ != 'l')
f04c66a
+                    return 1;
f04c66a
+                if (*ptr == 'u')
f04c66a
+                    ptr++;
f04c66a
+                else
f04c66a
+                    return 1;
f04c66a
+                n++;
f04c66a
+            }
f04c66a
+        }
f04c66a
+
f04c66a
+    return (n != 3);
f04c66a
+}
f04c66a
+
f04c66a
+
f04c66a
 int vdef_parse(
f04c66a
     struct graph_desc_t
f04c66a
     *gdes,