summaryrefslogtreecommitdiff
path: root/ext/readline
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-08-23 14:02:48 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2019-08-23 14:04:31 +0200
commit514be3ff8723628058afd70f75f2501b1797cccf (patch)
treefa2b585009c894af13670182e11b34da8b33ab30 /ext/readline
parenteeb910911d914ca44271e9dbd2def5dadb466528 (diff)
parent03c7749dc8f40df8f41afffcdef4595ad43afe7f (diff)
downloadphp-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.c11
-rw-r--r--ext/readline/tests/bug77812-libedit.phpt34
-rw-r--r--ext/readline/tests/bug77812-readline.phpt54
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 >