From 121a075bc2558003990377843393ca27d784f50f Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 2 Dec 2020 20:47:06 +0300 Subject: Fix buildscript assertion failure on redirecting command stderr to stdout --- libbuild2/script/run.cxx | 14 +++++++++++++- tests/recipe/buildscript/testscript | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/libbuild2/script/run.cxx b/libbuild2/script/run.cxx index 182696b..90ddc4d 100644 --- a/libbuild2/script/run.cxx +++ b/libbuild2/script/run.cxx @@ -1552,8 +1552,20 @@ namespace build2 // Merge standard streams. // bool mo (out != nullptr && out->type == redirect_type::merge); - if (mo || err.type == redirect_type::merge) + bool me (err.type == redirect_type::merge); + + if (mo || me) { + // Note that while the parser verifies that there is no stdout/stderr + // mutual redirects specified on the command line, we can still end up + // with mutual redirects here since one of such redirects can be + // provided as a default by the script environment implementation + // which the parser is not aware of at the time of parsing the command + // line. + // + if (mo && me) + fail (ll) << "stdout and stderr redirected to each other"; + auto_fd& self (mo ? ofd.out : efd); auto_fd& other (mo ? efd : ofd.out); diff --git a/tests/recipe/buildscript/testscript b/tests/recipe/buildscript/testscript index d1adc36..2603f62 100644 --- a/tests/recipe/buildscript/testscript +++ b/tests/recipe/buildscript/testscript @@ -83,6 +83,29 @@ $* clean 2>- } + : mutual-redirects + : + { + echo 'bar' >=bar; + + cat <=buildfile; + foo: bar + % [diag=cp] + {{ + echo 'copying' 2>&1 + cp $path($<) $path($>) + }} + EOI + + $* 2>>~%EOE% != 0; + cp file{foo} + buildfile:4:3: error: stdout and stderr redirected to each other + %.+ + EOE + + $* clean 2>- + } + : untracked-var : { -- cgit v1.1