diff options
Diffstat (limited to 'ext/readline')
-rw-r--r-- | ext/readline/readline_cli.c | 11 | ||||
-rw-r--r-- | ext/readline/tests/bug77812-libedit.phpt | 34 | ||||
-rw-r--r-- | ext/readline/tests/bug77812-readline.phpt | 54 |
3 files changed, 95 insertions, 4 deletions
diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c index c533fc2743..d7d96b59e1 100644 --- a/ext/readline/readline_cli.c +++ b/ext/readline/readline_cli.c @@ -351,11 +351,14 @@ static int cli_is_valid_code(char *code, size_t len, zend_string **prompt) /* {{ break; case heredoc: ZEND_ASSERT(heredoc_tag); - if (code[i - (heredoc_len + 1)] == '\n' && !strncmp(code + i - heredoc_len, heredoc_tag, heredoc_len) && code[i] == '\n') { - code_type = body; - } else if (code[i - (heredoc_len + 2)] == '\n' && !strncmp(code + i - heredoc_len - 1, heredoc_tag, heredoc_len) && code[i-1] == ';' && code[i] == '\n') { + if (!strncmp(code + i - heredoc_len + 1, heredoc_tag, heredoc_len)) { + unsigned char c = code[i + 1]; + char *p = code + i - heredoc_len; + + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c >= 0x80) break; + while (*p == ' ' || *p == '\t') p--; + if (*p != '\n') break; code_type = body; - valid_end = 1; } break; case outside: diff --git a/ext/readline/tests/bug77812-libedit.phpt b/ext/readline/tests/bug77812-libedit.phpt new file mode 100644 index 0000000000..478274a19a --- /dev/null +++ b/ext/readline/tests/bug77812-libedit.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #77812 (Interactive mode does not support PHP 7.3-style heredoc) +--SKIPIF-- +<?php +if (!extension_loaded('readline')) die('skip readline extension not available'); +if (READLINE_LIB !== "libedit") die('skip libedit only'); +if (!function_exists('proc_open')) die('skip proc_open() not available'); +?> +--FILE-- +<?php +$php = getenv('TEST_PHP_EXECUTABLE'); +$ini = getenv('TEST_PHP_EXTRA_ARGS'); +$descriptorspec = [['pipe', 'r'], STDOUT, STDERR]; +$proc = proc_open("$php $ini -a", $descriptorspec, $pipes); +var_dump($proc); +fwrite($pipes[0], "echo <<<FOO\n bar\n FOO;\n"); +fwrite($pipes[0], "print(<<<FOO\nxx\nFOO);\n"); +fwrite($pipes[0], "echo <<<FOO\n xxx\n FOO;\nFOO\n;\n"); +fwrite($pipes[0], "echo <<<FOO\nFOOL\nFOO\n,1;\n"); +fwrite($pipes[0], "echo <<<FOO\nFOO4\nFOO\n,2;\n"); +fclose($pipes[0]); +proc_close($proc); +?> +--EXPECTF-- +resource(%d) of type (process) +Interactive shell + +bar +xx +xxx + +Warning: Use of undefined constant FOO - assumed 'FOO' (this will throw an Error in a future version of PHP) in php shell code on line %d +FOOL1 +FOO42 diff --git a/ext/readline/tests/bug77812-readline.phpt b/ext/readline/tests/bug77812-readline.phpt new file mode 100644 index 0000000000..32d9f4d960 --- /dev/null +++ b/ext/readline/tests/bug77812-readline.phpt @@ -0,0 +1,54 @@ +--TEST-- +Bug #77812 (Interactive mode does not support PHP 7.3-style heredoc) +--SKIPIF-- +<?php +if (!extension_loaded('readline')) die('skip readline extension not available'); +if (READLINE_LIB !== "readline") die('skip readline only'); +if (!function_exists('proc_open')) die('skip proc_open() not available'); +?> +--FILE-- +<?php +$php = getenv('TEST_PHP_EXECUTABLE'); +$ini = getenv('TEST_PHP_EXTRA_ARGS'); +$descriptorspec = [['pipe', 'r'], STDOUT, STDERR]; +$proc = proc_open("$php $ini -a", $descriptorspec, $pipes); +var_dump($proc); +fwrite($pipes[0], "echo <<<FOO\n bar\n FOO;\n"); +fwrite($pipes[0], "print(<<<FOO\nxx\nFOO);\n"); +fwrite($pipes[0], "echo <<<FOO\n xxx\n FOO;\nFOO\n;\n"); +fwrite($pipes[0], "echo <<<FOO\nFOOL\nFOO\n,1;\n"); +fwrite($pipes[0], "echo <<<FOO\nFOO4\nFOO\n,2;\n"); +fclose($pipes[0]); +proc_close($proc); +?> +--EXPECTF-- +resource(%d) of type (process) +Interactive shell + +php > echo <<<FOO +<<< > bar +<<< > FOO; +bar +php > print(<<<FOO +<<< > xx +<<< > FOO); +xx +php > echo <<<FOO +<<< > xxx +<<< > FOO; +xxx +php > FOO +php > ; + +Warning: Use of undefined constant FOO - assumed 'FOO' (this will throw an Error in a future version of PHP) in php shell code on line %d +php > echo <<<FOO +<<< > FOOL +<<< > FOO +php > ,1; +FOOL1 +php > echo <<<FOO +<<< > FOO4 +<<< > FOO +php > ,2; +FOO42 +php > |