Skip to content

Commit

Permalink
Switched to a more advanced regex to test wheter parameter is a varia…
Browse files Browse the repository at this point in the history
…ble (#567)

* This appears to fix #453, #498, #499 and possibly more issues.
  • Loading branch information
wisskid committed Apr 13, 2020
1 parent 17d4d43 commit 4396351
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
1 change: 1 addition & 0 deletions change_log.txt
@@ -1,4 +1,5 @@
- fix foreachelse on arrayiterators https://github.com/smarty-php/smarty/issues/506
- fix errors that occured where isset was replaced with null check such as https://github.com/smarty-php/smarty/issues/453

===== 3.1.34 release ===== 05.11.2019
13.01.2020
Expand Down
34 changes: 21 additions & 13 deletions libs/sysplugins/smarty_internal_templatecompilerbase.php
Expand Up @@ -621,22 +621,18 @@ public function compilePHPFunctionCall($name, $parameter)
|| strcasecmp($name, 'array') === 0 || is_callable($name)
) {
$func_name = strtolower($name);
$par = implode(',', $parameter);
$parHasFuction = strpos($par, '(') !== false;

if ($func_name === 'isset') {
if (count($parameter) === 0) {
$this->trigger_template_error('Illegal number of parameter in "isset()"');
}
if ($parHasFuction) {
$pa = array();
foreach ($parameter as $p) {
$pa[] = (strpos($p, '(') === false) ? ('isset(' . $p . ')') : ('(' . $p . ' !== null )');
}
return '(' . implode(' && ', $pa) . ')';
} else {
$isset_par = str_replace("')->value", "',null,true,false)->value", $par);
}
return $name . '(' . $isset_par . ')';

$pa = array();
foreach ($parameter as $p) {
$pa[] = $this->syntaxMatchesVariable($p) ? 'isset(' . $p . ')' : '(' . $p . ' !== null )';
}
return '(' . implode(' && ', $pa) . ')';

} elseif (in_array(
$func_name,
array(
Expand All @@ -653,7 +649,7 @@ public function compilePHPFunctionCall($name, $parameter)
$this->trigger_template_error("Illegal number of parameter in '{$func_name()}'");
}
if ($func_name === 'empty') {
if ($parHasFuction && version_compare(PHP_VERSION, '5.5.0', '<')) {
if (!$this->syntaxMatchesVariable($parameter[0]) && version_compare(PHP_VERSION, '5.5.0', '<')) {
return '(' . $parameter[ 0 ] . ' === false )';
} else {
return $func_name . '(' .
Expand All @@ -671,6 +667,18 @@ public function compilePHPFunctionCall($name, $parameter)
}
}

/**
* Determines whether the passed string represents a valid (PHP) variable.
* This is important, because `isset()` only works on variables and `empty()` can only be passed
* a variable prior to php5.5
* @param $string
* @return bool
*/
private function syntaxMatchesVariable($string) {
static $regex_pattern = '/^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*((->)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|\[.*]*\])*$/';
return 1 === preg_match($regex_pattern, trim($string));
}

/**
* This method is called from parser to process a text content section
* - remove text from inheritance child templates as they may generate output
Expand Down

0 comments on commit 4396351

Please sign in to comment.