diff options
author | Ali Mohammad Pur <ali.mpfard@gmail.com> | 2021-05-01 12:44:09 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-01 15:58:31 +0200 |
commit | 70728b49e266e2e71fe69d675d117a2b30435bdb (patch) | |
tree | 3e6c06586baa1424dbdb40e74ec44e2d32cb8af4 /Userland/Shell | |
parent | 323a408d8c13827e9e24235e186cb6f42f803c83 (diff) | |
download | serenity-70728b49e266e2e71fe69d675d117a2b30435bdb.zip |
Shell: Move the heredocs vector to a local value before processing it
Otherwise we would end up trying to parse the same heredoc entry, if it
contained a sequence terminated by a newline.
e.g. `<<-x\n$({` would attempt to read a heredoc entry after `x`, and
then after `{` while inside the first heredoc entry.
To make this work, we can simply empty the instance vector and keep the
state on the stack.
Issue found through oss-fuzz:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=33852
Diffstat (limited to 'Userland/Shell')
-rw-r--r-- | Userland/Shell/Parser.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/Userland/Shell/Parser.cpp b/Userland/Shell/Parser.cpp index 7d980909df..410b633eda 100644 --- a/Userland/Shell/Parser.cpp +++ b/Userland/Shell/Parser.cpp @@ -1982,8 +1982,10 @@ RefPtr<AST::Node> Parser::parse_heredoc_initiation_record() bool Parser::parse_heredoc_entries() { + auto heredocs = move(m_heredoc_initiations); + m_heredoc_initiations.clear(); // Try to parse heredoc entries, as reverse recorded in the initiation records - for (auto& record : m_heredoc_initiations) { + for (auto& record : heredocs) { auto rule_start = push_start(); if (m_rule_start_offsets.size() > max_allowed_nested_rule_depth) { record.node->set_is_syntax_error(*create<AST::SyntaxError>(String::formatted("Expression nested too deep (max allowed is {})", max_allowed_nested_rule_depth))); @@ -2070,8 +2072,6 @@ bool Parser::parse_heredoc_entries() record.node->set_contents(create<AST::DoubleQuotedString>(move(expr))); } } - - m_heredoc_initiations.clear(); return true; } |