Skip to content

stdlib: token_get_all() null byte after $ — literal dollar (#13896) - #13908

Merged
PurHur merged 1 commit into
masterfrom
agent/issue-13896-token-get-all-null-byte
Jun 30, 2026
Merged

PurHur merged 1 commit into
masterfrom
agent/issue-13896-token-get-all-null-byte

Conversation

@PurHur

@PurHur PurHur commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • Fix LanguageScanner::scanVariable() to emit a literal '$' token when $ is not followed by a variable label start (php-src zend_language_scanner.l).
  • Resolves token_get_all('<?php $\0 = 1;') returning T_VARIABLE with value '$' instead of a literal dollar + T_BAD_CHARACTER.

php-src reference

  • ext/tokenizer/tokenizer.c — token_get_all delegates to Zend scanner
  • Zend/zend_language_scanner.l — bad-character handling after $

Verification

./script/docker-exec.sh -- bash -lc 'php bin/vm.php test/repro/maintainer_gap_token_get_all_null_byte.php'
# ok

./script/docker-exec.sh -- bash -lc 'php bin/vm.php test/compliance/cases/stdlib/token_get_all_null_byte.phpt'
# dollar / bad_char

./script/docker-exec.sh -- bash -lc 'php -r "
\$src = \"<?php \\\$\\0 = 1;\";
echo json_encode(array_slice(token_get_all(\$src), 1, 2)), PHP_EOL;
" && php bin/vm.php -r "
\$src = \"<?php \\\$\\0 = 1;\";
echo json_encode(array_slice(token_get_all(\$src), 1, 2)), PHP_EOL;
"'
# Both: ["$",[405,"\u0000",1]]

./script/docker-exec.sh -- bash -lc 'vendor/bin/phpunit test/unit/VmTokenizerNativeTest.php --filter 13896'
# OK

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/compile.php -l test/repro/maintainer_gap_token_get_all_null_byte.php'
# exit 0

Closes #13896

Made with Cursor

…#13896)

When $ is not followed by a variable label start, emit a literal '$' token
matching php-src zend_language_scanner.l (e.g. $\0 = 1;).

Co-authored-by: Cursor <cursoragent@cursor.com>
@PurHur
PurHur merged commit d734786 into master Jun 30, 2026
@PurHur
PurHur deleted the agent/issue-13896-token-get-all-null-byte branch June 30, 2026 02:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stdlib: token_get_all() null byte after $ — T_VARIABLE not literal dollar + T_BAD_CHARACTER (ext/tokenizer/tokenizer.c)

1 participant