mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Fixed bug #26463 (Incorrect handling of semicolons after heredoc)
This commit is contained in:
parent
bfa36a8ea7
commit
99dec6927c
@ -181,13 +181,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
|
||||
break;
|
||||
}
|
||||
} else if (token_type == T_END_HEREDOC) {
|
||||
zend_bool has_semicolon=(strchr(token.value.str.val, ';')?1:0);
|
||||
|
||||
efree(token.value.str.val);
|
||||
if (has_semicolon) {
|
||||
/* the following semicolon was unput(), ignore it */
|
||||
lex_scan(&token TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
token.type = 0;
|
||||
}
|
||||
|
@ -1702,8 +1702,8 @@ NEWLINE ("\r"|"\n"|"\r\n")
|
||||
}
|
||||
|
||||
if (label_len==CG(heredoc_len) && !memcmp(yytext, CG(heredoc), label_len)) {
|
||||
zendlval->value.str.val = estrndup(yytext, yyleng); /* unput destroys yytext */
|
||||
zendlval->value.str.len = yyleng;
|
||||
zendlval->value.str.val = estrndup(yytext, label_len); /* unput destroys yytext */
|
||||
zendlval->value.str.len = label_len;
|
||||
if (unput_semicolon) {
|
||||
unput(';');
|
||||
}
|
||||
|
19
ext/standard/tests/general_functions/highlight_heredoc.phpt
Normal file
19
ext/standard/tests/general_functions/highlight_heredoc.phpt
Normal file
@ -0,0 +1,19 @@
|
||||
--TEST--
|
||||
highlight_string() handling of heredoc
|
||||
--FILE--
|
||||
<?php
|
||||
$str = '
|
||||
$x=<<<DD
|
||||
jhdsjkfhjdsh
|
||||
DD
|
||||
."";
|
||||
$a=<<<DDDD
|
||||
jhdsjkfhjdsh
|
||||
DDDD;
|
||||
';
|
||||
highlight_string($str);
|
||||
?>
|
||||
--EXPECT--
|
||||
<code><font color="#000000">
|
||||
<br />$x=<<<DD<br />jhdsjkfhjdsh<br />DD<br />."";<br />$a=<<<DDDD<br />jhdsjkfhjdsh<br />DDDD;<br /></font>
|
||||
</code>
|
118
ext/tokenizer/tests/bug26463.phpt
Normal file
118
ext/tokenizer/tests/bug26463.phpt
Normal file
@ -0,0 +1,118 @@
|
||||
--TEST--
|
||||
Bug #26463 (token_get_all() does not correctly handle semicolons after T_END_HEREDOC)
|
||||
--FILE--
|
||||
<?php
|
||||
$str = '<?php
|
||||
$x=<<<DD
|
||||
jhdsjkfhjdsh
|
||||
DD
|
||||
."";
|
||||
$a=<<<DDDD
|
||||
jhdsjkfhjdsh
|
||||
DDDD;
|
||||
?>';
|
||||
var_dump(token_get_all($str));
|
||||
?>
|
||||
--EXPECT--
|
||||
array(17) {
|
||||
[0]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(363)
|
||||
[1]=>
|
||||
string(6) "<?php
|
||||
"
|
||||
}
|
||||
[1]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(307)
|
||||
[1]=>
|
||||
string(2) "$x"
|
||||
}
|
||||
[2]=>
|
||||
string(1) "="
|
||||
[3]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(367)
|
||||
[1]=>
|
||||
string(6) "<<<DD
|
||||
"
|
||||
}
|
||||
[4]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(305)
|
||||
[1]=>
|
||||
string(13) "jhdsjkfhjdsh
|
||||
"
|
||||
}
|
||||
[5]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(368)
|
||||
[1]=>
|
||||
string(2) "DD"
|
||||
}
|
||||
[6]=>
|
||||
string(1) "."
|
||||
[7]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(313)
|
||||
[1]=>
|
||||
string(2) """"
|
||||
}
|
||||
[8]=>
|
||||
string(1) ";"
|
||||
[9]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(366)
|
||||
[1]=>
|
||||
string(1) "
|
||||
"
|
||||
}
|
||||
[10]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(307)
|
||||
[1]=>
|
||||
string(2) "$a"
|
||||
}
|
||||
[11]=>
|
||||
string(1) "="
|
||||
[12]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(367)
|
||||
[1]=>
|
||||
string(8) "<<<DDDD
|
||||
"
|
||||
}
|
||||
[13]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(305)
|
||||
[1]=>
|
||||
string(13) "jhdsjkfhjdsh
|
||||
"
|
||||
}
|
||||
[14]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(368)
|
||||
[1]=>
|
||||
string(4) "DDDD"
|
||||
}
|
||||
[15]=>
|
||||
string(1) ";"
|
||||
[16]=>
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(365)
|
||||
[1]=>
|
||||
string(2) "?>"
|
||||
}
|
||||
}
|
@ -361,7 +361,12 @@ static void tokenize(zval *return_value TSRMLS_DC)
|
||||
MAKE_STD_ZVAL(keyword);
|
||||
array_init(keyword);
|
||||
add_next_index_long(keyword, token_type);
|
||||
add_next_index_stringl(keyword, zendtext, zendleng, 1);
|
||||
if (token_type == T_END_HEREDOC) {
|
||||
add_next_index_stringl(keyword, Z_STRVAL(token), Z_STRLEN(token), 1);
|
||||
efree(Z_STRVAL(token));
|
||||
} else {
|
||||
add_next_index_stringl(keyword, zendtext, zendleng, 1);
|
||||
}
|
||||
add_next_index_zval(return_value, keyword);
|
||||
} else {
|
||||
add_next_index_stringl(return_value, zendtext, zendleng, 1);
|
||||
@ -369,9 +374,6 @@ static void tokenize(zval *return_value TSRMLS_DC)
|
||||
if (destroy && Z_TYPE(token) != IS_NULL) {
|
||||
zval_dtor(&token);
|
||||
}
|
||||
if (token_type == T_END_HEREDOC) {
|
||||
efree(Z_STRVAL(token));
|
||||
}
|
||||
ZVAL_NULL(&token);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user