diff options
Diffstat (limited to 'ext/readline/readline_cli.c')
-rw-r--r-- | ext/readline/readline_cli.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/ext/readline/readline_cli.c b/ext/readline/readline_cli.c index 69ebe117cb..6e6e9161be 100644 --- a/ext/readline/readline_cli.c +++ b/ext/readline/readline_cli.c @@ -347,11 +347,14 @@ static int cli_is_valid_code(char *code, size_t len, zend_string **prompt) /* {{ } break; case heredoc: - 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: |