Fix syntax error occurring when registering a function plugin that ends with the string 'close' (#1124)

Fixes #1122
This commit is contained in:
Simon Wisselink
2025-04-10 23:47:44 +02:00
committed by GitHub
parent a0664a4ab2
commit a5bbba3f05
3 changed files with 16 additions and 6 deletions

1
changelog/1122.md Normal file
View File

@ -0,0 +1 @@
- Fix syntax error occurring when registering a function plugin that ends with the string 'close' [#1122](https://github.com/smarty-php/smarty/issues/1122)

View File

@ -1146,12 +1146,12 @@ class Template extends BaseCompiler {
} }
// check if tag is a function // check if tag is a function
if ($this->smarty->getFunctionHandler($base_tag)) { if ($this->smarty->getFunctionHandler($tag)) {
if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($base_tag, $this)) { if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
return (new \Smarty\Compile\PrintExpressionCompiler())->compile( return (new \Smarty\Compile\PrintExpressionCompiler())->compile(
['nofilter'], // functions are never auto-escaped ['nofilter'], // functions are never auto-escaped
$this, $this,
['value' => $this->compileFunctionCall($base_tag, $args, $parameter)] ['value' => $this->compileFunctionCall($tag, $args, $parameter)]
); );
} }
} }
@ -1164,16 +1164,16 @@ class Template extends BaseCompiler {
} }
// the default plugin handler is a handler of last resort, it may also handle not specifically registered tags. // the default plugin handler is a handler of last resort, it may also handle not specifically registered tags.
if ($callback = $this->getPluginFromDefaultHandler($base_tag, Smarty::PLUGIN_COMPILER)) { if ($callback = $this->getPluginFromDefaultHandler($tag, Smarty::PLUGIN_COMPILER)) {
if (!empty($parameter['modifierlist'])) { if (!empty($parameter['modifierlist'])) {
throw new CompilerException('No modifiers allowed on ' . $base_tag); throw new CompilerException('No modifiers allowed on ' . $tag);
} }
$tagCompiler = new \Smarty\Compile\Tag\BCPluginWrapper($callback); $tagCompiler = new \Smarty\Compile\Tag\BCPluginWrapper($callback);
return $tagCompiler->compile($args, $this, $parameter); return $tagCompiler->compile($args, $this, $parameter);
} }
if ($this->getPluginFromDefaultHandler($base_tag, Smarty::PLUGIN_FUNCTION)) { if ($this->getPluginFromDefaultHandler($base_tag, Smarty::PLUGIN_FUNCTION)) {
return $this->defaultHandlerFunctionCallCompiler->compile($args, $this, $parameter, $tag, $base_tag); return $this->defaultHandlerFunctionCallCompiler->compile($args, $this, $parameter, $tag, $tag);
} }
if ($this->getPluginFromDefaultHandler($base_tag, Smarty::PLUGIN_BLOCK)) { if ($this->getPluginFromDefaultHandler($base_tag, Smarty::PLUGIN_BLOCK)) {

View File

@ -192,6 +192,15 @@ class RegisterFunctionTest extends PHPUnit_Smarty
]; ];
} }
/**
* test registerPlugin for function name ending in 'close' #1122
*/
public function testRegisterFunctionEndingInClose()
{
$this->smarty->registerPlugin(Smarty::PLUGIN_FUNCTION, 'window_close', 'myfunction');
$this->assertEquals('hello world 1', $this->smarty->fetch('eval:{window_close value=1}'));
}
} }
function myfunction($params, $smarty) function myfunction($params, $smarty)