Throw syntax exception for unclosed tags.

Fixes #395
This commit is contained in:
Justin Hileman
2022-07-28 10:10:14 -04:00
parent c9718673e5
commit 64e5609d0e
2 changed files with 70 additions and 0 deletions
+31
View File
@@ -215,6 +215,10 @@ class Mustache_Tokenizer
}
}
if ($this->state !== self::IN_TEXT) {
$this->throwUnclosedTagException();
}
$this->flushBuffer();
// Restore the user's encoding...
@@ -279,6 +283,10 @@ class Mustache_Tokenizer
$close = '=' . $this->ctag;
$closeIndex = strpos($text, $close, $index);
if ($closeIndex === false) {
$this->throwUnclosedTagException();
}
$token = array(
self::TYPE => self::T_DELIM_CHANGE,
self::LINE => $this->line,
@@ -333,6 +341,10 @@ class Mustache_Tokenizer
private function addPragma($text, $index)
{
$end = strpos($text, $this->ctag, $index);
if ($end === false) {
$this->throwUnclosedTagException();
}
$pragma = trim(substr($text, $index + 2, $end - $index - 2));
// Pragmas are hoisted to the front of the template.
@@ -344,4 +356,23 @@ class Mustache_Tokenizer
return $end + $this->ctagLen - 1;
}
private function throwUnclosedTagException()
{
$name = trim($this->buffer);
if ($name !== '') {
$msg = sprintf('Unclosed tag: %s on line %d', $name, $this->line);
} else {
$msg = sprintf('Unclosed tag on line %d', $this->line);
}
throw new Mustache_Exception_SyntaxException($msg, array(
self::TYPE => $this->tagType,
self::NAME => $name,
self::OTAG => $this->otag,
self::CTAG => $this->ctag,
self::LINE => $this->line,
self::INDEX => $this->seenTag - $this->otagLen,
));
}
}
+39
View File
@@ -351,4 +351,43 @@ class Mustache_Test_TokenizerTest extends PHPUnit_Framework_TestCase
),
);
}
/**
* @dataProvider getUnclosedTags
* @expectedException Mustache_Exception_SyntaxException
*/
public function testUnclosedTagsThrowExceptions($text)
{
$tokenizer = new Mustache_Tokenizer();
$tokenizer->scan($text, null);
}
public function getUnclosedTags()
{
return array(
array('{{ name'),
array('{{ name }'),
array('{{{ name'),
array('{{{ name }'),
array('{{& name'),
array('{{& name }'),
array('{{# name'),
array('{{# name }'),
array('{{^ name'),
array('{{^ name }'),
array('{{/ name'),
array('{{/ name }'),
array('{{> name'),
array('{{< name'),
array('{{> name }'),
array('{{< name }'),
array('{{$ name'),
array('{{$ name }'),
array('{{= <% %>'),
array('{{= <% %>='),
array('{{= <% %>=}'),
array('{{% name'),
array('{{% name }'),
);
}
}