X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_cgi.c;h=a734fef91e8e9c3fdefce5a7b76ab92dea7907a5;hb=361a0fd38d7adf95847508f54c0bde9b3f98662e;hp=d72879f023a2c4a55b03b3a42fc2067a5d50e0e2;hpb=0c87c2676bb826f8defb40d7d45e771ecd40550c;p=rrdtool.git diff --git a/src/rrd_cgi.c b/src/rrd_cgi.c index d72879f..a734fef 100644 --- a/src/rrd_cgi.c +++ b/src/rrd_cgi.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.1.x Copyright Tobias Oetiker, 1997 - 2004 + * RRDtool 1.2.8 Copyright by Tobi Oetiker, 1997-2005 ***************************************************************************** * rrd_cgi.c RRD Web Page Generator *****************************************************************************/ @@ -220,6 +220,9 @@ rrd_expand_vars(char* buffer) parse(&buffer, i, "= 1) { - readfile(args[0], &buffer, 0); + char* filename = args[0]; + readfile(filename, &buffer, 0); if (rrd_test_error()) { char *err = malloc((strlen(rrd_get_error())+DS_NAM_SIZE)); sprintf(err, "[ERROR: %s]",rrd_get_error()); @@ -604,55 +625,58 @@ char* cgigetq(long argc, const char **args){ paths which came in via cgi do not go UP ... */ char* cgigetqp(long argc, const char **args){ - if (argc>= 1) { - char *buf = rrdstrip(cgiGetValue(cgiArg,args[0])); - char *buf2; - char *c,*d; - int qc=0; - - if (buf==NULL) - return NULL; - - for(c=buf;*c != '\0';c++) { - if (*c == '"') { - qc++; - } - } - - if ((buf2 = malloc((strlen(buf) + 4 * qc + 4))) == NULL) { - perror("Malloc Buffer"); - exit(1); + char* buf; + char* buf2; + char* p; + char* d; + + if (argc < 1) + { + return stralloc("[ERROR: not enough arguments for RRD::CV::PATH]"); + } + + buf = rrdstrip(cgiGetValue(cgiArg, args[0])); + if (!buf) + { + return NULL; + } + + buf2 = malloc(strlen(buf)+1); + if (!buf2) + { + perror("cgigetqp(): Malloc Path Buffer"); + exit(1); }; - c=buf; - d=buf2; - - *(d++) = '"'; - while (*c != '\0') { - if (*c == '"') { - *(d++) = '"'; - *(d++) = '\''; - *(d++) = '"'; - *(d++) = '\''; - } - if(*c == '/') { - *(d++) = '_'; - c++; - } else { - if (*c=='.' && *(c+1) == '.') { - c += 2; - *(d++) = '_'; *(d++) ='_'; - } else { - *(d++) = *(c++); - } - } + p = buf; + d = buf2; + + while (*p) + { + /* prevent mallicious paths from entering the system */ + if (p[0] == '.' && p[1] == '.') + { + p += 2; + *d++ = '_'; + *d++ = '_'; + } + else + { + *d++ = *p++; + } } - *(d++) = '"'; - *(d) = '\0'; + + *d = 0; free(buf); + + /* Make sure the path is relative, e.g. does not start with '/' */ + p = buf2; + while ('/' == *p) + { + *p++ = '_'; + } + return buf2; - } - return stralloc("[ERROR: not enough arguments for RRD::CV::PATH]"); } @@ -667,16 +691,15 @@ char* cgiget(long argc, const char **args){ char* drawgraph(long argc, char **args){ int i,xsize, ysize; + double ymin,ymax; for(i=0;i"; } - optind=0; /* reset gnu getopt */ - opterr=0; /* reset gnu getopt */ calfree(); - if( rrd_graph(argc+1, args-1, &calcpr, &xsize, &ysize,NULL) != -1 ) { + if( rrd_graph(argc+1, args-1, &calcpr, &xsize, &ysize,NULL,&ymin,&ymax) != -1 ) { return stralloc(calcpr[0]); } else { if (rrd_test_error()) { @@ -816,7 +839,7 @@ scanargs(char *line, int *argument_count, char ***arguments) { case ' ': if (Quote || tagcount) { - /* copy quoted/tagged string */ + /* copy quoted/tagged (=RRD expanded) string */ *putP++ = c; } else if (in_arg) @@ -842,7 +865,7 @@ scanargs(char *line, int *argument_count, char ***arguments) } } else { if (!in_arg) { - /* reference argument string in argument array */ + /* reference start of argument string in argument array */ argv[argc++] = putP; in_arg=1; } @@ -851,7 +874,6 @@ scanargs(char *line, int *argument_count, char ***arguments) break; default: - if (!Quote) { if (!in_arg) { /* start new argument */ argv[argc++] = putP; @@ -868,7 +890,6 @@ scanargs(char *line, int *argument_count, char ***arguments) curarg_contains_rrd_directives = 1; } } - } *putP++ = c; break; }