Code

patches: Added bts573638-rrdcgi-segfault.
authorSebastian Harl <sh@tokkee.org>
Sun, 21 Mar 2010 20:29:21 +0000 (21:29 +0100)
committerSebastian Harl <sh@tokkee.org>
Sun, 21 Mar 2010 20:29:21 +0000 (21:29 +0100)
This is an upstream patch fixing a segfault in rrdcgi's printlasttime() (and
possibly others).

Also, updated changelog to 1.4.2-2.

Thanks to Robert Luberda for reporting this!
Closes: #573638
debian/changelog
debian/patches/bts573638-rrdcgi-segfault [new file with mode: 0644]
debian/patches/series

index 976841283165f2da6c8628b7b69c0245230dea04..c852f1f949aa0810f187e9dae4f01cad3c7e5cd7 100644 (file)
@@ -1,3 +1,12 @@
+rrdtool (1.4.2-2) unstable; urgency=low
+
+  * debian/patches:
+    - Added bts573638-rrdcgi-segfault: upstream patch fixing a segfault in
+      rrdcgi's printlasttime() (and possibly others); thanks to Robert Luberda
+      for reporting this (Closes: #573638).
+
+ -- Sebastian Harl <tokkee@debian.org>  Sun, 21 Mar 2010 21:28:05 +0100
+
 rrdtool (1.4.2-1) unstable; urgency=low
 
   [ Bernd Zeimetz ]
 rrdtool (1.4.2-1) unstable; urgency=low
 
   [ Bernd Zeimetz ]
diff --git a/debian/patches/bts573638-rrdcgi-segfault b/debian/patches/bts573638-rrdcgi-segfault
new file mode 100644 (file)
index 0000000..844d5fa
--- /dev/null
@@ -0,0 +1,82 @@
+diff a/src/rrd_cgi.c b/src/rrd_cgi.c
+--- a/src/rrd_cgi.c
++++ b/src/rrd_cgi.c
+@@ -988,7 +988,10 @@ char     *printtimelast(
+         if (buf == NULL) {
+             return stralloc("[ERROR: allocating strftime buffer]");
+         };
+-        last = rrd_last(argc + 1, (char **) args - 1);
++        /* not raising argc in step with args - 1 since the last argument
++           will be used below for strftime  */
++
++        last = rrd_last(argc, (char **) args - 1);
+         if (rrd_test_error()) {
+             char     *err =
+                 malloc((strlen(rrd_get_error()) +
+@@ -1001,10 +1004,7 @@ char     *printtimelast(
+         strftime(buf, 254, args[1], &tm_last);
+         return buf;
+     }
+-    if (argc < 2) {
+-        return stralloc("[ERROR: too few arguments for RRD::TIME::LAST]");
+-    }
+-    return stralloc("[ERROR: not enough arguments for RRD::TIME::LAST]");
++    return stralloc("[ERROR: expected <RRD::TIME::LAST file.rrd strftime-format>]");
+ }
+ char     *printtimenow(
+@@ -1053,7 +1053,7 @@ char     *scanargs(
+     int       curarg_contains_rrd_directives;
+     /* local array of arguments while parsing */
+-    int       argc = 0;
++    int       argc = 1;
+     char    **argv;
+ #ifdef DEBUG_PARSER
+@@ -1069,6 +1069,7 @@ char     *scanargs(
+     if (!argv) {
+         return NULL;
+     }
++    argv[0] = "rrdcgi";
+     /* skip leading blanks */
+     while (isspace((int) *line)) {
+@@ -1172,7 +1173,7 @@ char     *scanargs(
+         argv[argc - 1] = rrd_expand_vars(stralloc(argv[argc - 1]));
+     }
+ #ifdef DEBUG_PARSER
+-    if (argc > 0) {
++    if (argc > 1) {
+         int       n;
+         printf("<-- arguments found [%d]\n", argc);
+@@ -1186,8 +1187,17 @@ char     *scanargs(
+ #endif
+     /* update caller's notion of the argument array and it's size */
+-    *arguments = argv;
+-    *argument_count = argc;
++
++    /* note this is a bit of a hack since the rrd_cgi code used to just put
++       its arguments into a normal array starting at 0 ... since the rrd_*
++       commands expect and argc/argv array we used to just shift everything
++       by -1 ... this in turn exploded when a rrd_* function tried to print
++       argv[0] ... hence we are now doing everything in argv style but hand
++       over seemingly the old array ... but doing argv-1 will actually end
++       up in a 'good' place now. */
++
++    *arguments = argv+1;
++    *argument_count = argc-1;
+     if (Quote) {
+         return NULL;
+@@ -1241,7 +1251,7 @@ int parse(
+     if (end) {
+         /* got arguments, call function for 'tag' with arguments */
+         val = func(argc, (const char **) args);
+-        free(args);
++        free(args-1);
+     } else {
+         /* unable to parse arguments, undo 0-termination by scanargs */
+         for (; argc > 0; argc--) {
index e472686769fb37a4d5bcdabd40668061ac5a8c58..81b1166acad7746a3b026cb1acf183fd9011aea4 100644 (file)
@@ -4,3 +4,4 @@ no-rpath-for-ruby
 no-rpath-for-perl
 implicit-decl-fix
 bts530814-hurd
 no-rpath-for-perl
 implicit-decl-fix
 bts530814-hurd
+bts573638-rrdcgi-segfault