diff --git a/src/rrd_cgi.c b/src/rrd_cgi.c
index b5355410e364aef0c5de1582a210ad1100a618c1..1fabe705a5a8d46d4fef7e64cd44b3b9a96d8165 100644 (file)
--- a/src/rrd_cgi.c
+++ b/src/rrd_cgi.c
/*****************************************************************************
- * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009
*****************************************************************************
* rrd_cgi.c RRD Web Page Generator
*****************************************************************************/
if (calcpr) {
free(calcpr);
}
+ calcpr = NULL;
}
}
DS_NAM_SIZE) * sizeof(char));
sprintf(err, "[ERROR: %s]", rrd_get_error());
rrd_clear_error();
- calfree();
return err;
}
}
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()) +
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(
int curarg_contains_rrd_directives;
/* local array of arguments while parsing */
- int argc = 0;
+ int argc = 1;
char **argv;
#ifdef DEBUG_PARSER
if (!argv) {
return NULL;
}
+ argv[0] = "rrdcgi";
/* skip leading blanks */
while (isspace((int) *line)) {
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);
#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;
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--) {
length = atoi(ip);
if ((line = (char *) malloc(length + 2)) == NULL)
return NULL;
- fgets(line, length + 1, stdin);
+ if (fgets(line, length + 1, stdin) == NULL)
+ return NULL;
} else
return NULL;
} else if (cp && !strcmp(cp, "GET")) {