From 045c85af4b68e7444d52be4e61d660637a456557 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Mon, 11 Oct 2021 10:19:04 +0330 Subject: [PATCH] Shell: Raise an error if an execute node ends up trying to run nothing ...while capturing its standard output. As `$()` is an invalid construct, execute nodes are not supposed to capture the output of no command being run; but it is possible to create empty commands such as CastToCommand(Redirection(...)) or similar. Make this a hard error instead of an unescapable select(). This was noticed in #10432, which should now error out like so: ``` Error: Cannot capture standard output when no command is being executed 0| $(<$file) ~~~~~^^^^^^^^^ 1| ``` --- Userland/Shell/AST.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Userland/Shell/AST.cpp b/Userland/Shell/AST.cpp index c7e7ebcc2e..954254828c 100644 --- a/Userland/Shell/AST.cpp +++ b/Userland/Shell/AST.cpp @@ -1550,6 +1550,19 @@ void Execute::for_each_entry(RefPtr shell, Functionexpand_aliases(m_command->run(shell)->resolve_as_commands(shell)); if (m_capture_stdout) { + // Make sure that we're going to be running _something_. + auto has_one_command = false; + for (auto& command : commands) { + if (command.argv.is_empty() && !command.pipeline && command.next_chain.is_empty()) + continue; + has_one_command = true; + break; + } + + if (!has_one_command) { + shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "Cannot capture standard output when no command is being executed", m_position); + return; + } int pipefd[2]; int rc = pipe(pipefd); if (rc < 0) {