From: Peter Krempa <[email protected]> Some test cases (such as cases excercising FD passing in qemuxmlconftest) use dup2 to put FDs on certain numbers to have stable test output. If the environment the test program is run in "leaks"/passes some FDs the test may file in a very obscure way.
Since the tests are designed to be standalone we can simply close everything except std(in|out|err) before running the tests to avoid unstable tests. Use virCommandFDMassClose to close everything except stdio. Signed-off-by: Peter Krempa <[email protected]> --- tests/testutils.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/testutils.c b/tests/testutils.c index 35571fb2ad..9ce549370b 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -33,6 +33,7 @@ #include "virbuffer.h" #include "virlog.h" #include "virstring.h" +#include "vircommand.h" #define VIR_FROM_THIS VIR_FROM_NONE @@ -840,6 +841,7 @@ int virTestMain(int argc, int (*func)(void), ...) { + g_autoptr(virBitmap) keepfds = virBitmapNew(0); const char *lib; va_list ap; int ret; @@ -859,6 +861,14 @@ int virTestMain(int argc, preloads[npreloads] = NULL; } + /* Environment may leak FDs into the test which we don't want to use and + * it could break certain test cases which use 'dup2' to put FDs to correct + * numbers to have stable output. */ + virBitmapSetBitExpand(keepfds, STDIN_FILENO); + virBitmapSetBitExpand(keepfds, STDOUT_FILENO); + virBitmapSetBitExpand(keepfds, STDERR_FILENO); + virCommandFDMassClose(keepfds); + va_start(ap, func); while ((lib = va_arg(ap, const char *))) { g_autofree char *abs_lib_path = g_strdup_printf("%s/%s", abs_builddir, lib); -- 2.54.0
