--- cacti-0.8.7g/script_server.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g-patched/script_server.php 2010-07-27 21:30:31.000000000 -0400 @@ -72,7 +72,7 @@ } /* record the script start time */ -list($micro,$seconds) = split(" ", microtime()); +list($micro,$seconds) = explode(" ", microtime()); $start = $seconds + $micro; /* some debugging */ @@ -171,7 +171,11 @@ if (isset($command_array[2])) { $parameters = trim($command_array[2]); - $parameter_array = explode(" ", trim($command_array[2])); + $parameter_array = array(); + if (!parseArgs($parameters, $parameter_array)) { + cacti_log("WARNING: Script Server count not parse '$parameters' for $function", false, "PHPSVR"); + return "U"; + } }else{ $parameters = ""; $parameters_array = array(); @@ -236,3 +240,111 @@ exit (-1); } } + +function parseArgs($string, &$str_list, $debug = false) { + $delimiters = array("'",'"'); + $delimited = false; + $str_list = array(); + + if ($debug) echo "String: '" . $string . "'\n"; + + foreach($delimiters as $delimiter) { + if (strpos($string, $delimiter) !== false) { + $delimited = true; + break; + } + } + + /* process the simple case */ + if (!$delimited) { + $str_list = explode(" ", $string); + + if ($debug) echo "Output: '" . implode(",", $str_list) . "'\n"; + + return true; + } + + /* Break str down into an array of characters and process */ + $char_array = str_split($string); + $escaping = false; + $indelim = false; + $parse_ok = true; + $curstr = ''; + foreach($char_array as $char) { + switch ($char) { + case '\'': + case '"': + if (!$indelim) { + if (!$escaping) { + $indelim = true; + }else{ + $curstr .= $char; + $escaping = false; + } + }elseif (!$escaping) { + $str_list[] = $curstr; + $curstr = ''; + $indelim = false; + }elseif ($escaping) { + $curstr .= $char; + $escaping = false; + } + + break; + case '\\': + if ($escaping) { + $curstr .= $char; + $escaping = false; + }else{ + $escaping = true; + } + + break; + case ' ': + if ($escaping) { + $parse_ok = false; + $msg = 'Parse error attempting to parse string'; + }elseif ($indelim) { + $curstr .= $char; + }elseif (strlen($curstr)) { + $str_list[] = $curstr; + $curstr = ''; + } + + break; + case '`': + $parse_ok = false; + $msg = 'Backtic (`) characters not allowed'; + + break; + default: + if ($escaping) { + $parse_ok = false; + $msg = 'Parse error attempting to parse string'; + }else{ + $curstr .= $char; + } + break; + } + + if (!$parse_ok) { + break; + } + } + + /* Add the last str to the string array */ + if ($indelim || $escaping) { + $parse_ok = false; + $msg = 'Parse error attempting to parse string'; + } + + if (!$parse_ok) { + echo "ERROR: " . $msg . " '" . $string . "'\n"; + }else{ + $str_list[] = $curstr; + } + + if ($debug) echo "Output: '" . implode(",", $str_list) . "'\n"; + + return $parse_ok; +}