diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2019-08-23 14:02:48 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2019-08-23 14:04:31 +0200 |
commit | 514be3ff8723628058afd70f75f2501b1797cccf (patch) | |
tree | fa2b585009c894af13670182e11b34da8b33ab30 /ext/readline | |
parent | eeb910911d914ca44271e9dbd2def5dadb466528 (diff) | |
parent | 03c7749dc8f40df8f41afffcdef4595ad43afe7f (diff) | |
download | php-git-514be3ff8723628058afd70f75f2501b1797cccf.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3:
Fix #77812: Interactive mode does not support PHP 7.3-style heredoc
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 > |