From 0fb951d92e6d2157ffc9005371984869c2c20d24 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Mon, 19 Aug 2019 22:59:37 +0000 Subject: [PATCH] [lit] Check for accidental external command calls This patch extends lit's test suite to check that lit's internal shell doesn't accidentally execute internal commands as external commands. It does so by putting fake failing versions of those commands in `PATH` while the entire lit test suite is running. Without the fixes in D65697 but with its tests, this approach catches accidental external `env` calls. Reviewed By: probinson Differential Revision: https://reviews.llvm.org/D66293 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369309 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/lit/tests/Inputs/fake-externals/cd | 5 +++++ utils/lit/tests/Inputs/fake-externals/diff | 5 +++++ utils/lit/tests/Inputs/fake-externals/env | 5 +++++ utils/lit/tests/Inputs/fake-externals/export | 5 +++++ .../lit/tests/Inputs/fake-externals/fake_external.py | 7 +++++++ utils/lit/tests/Inputs/fake-externals/mkdir | 5 +++++ utils/lit/tests/Inputs/fake-externals/rm | 5 +++++ utils/lit/tests/lit.cfg | 11 +++++++++++ 8 files changed, 48 insertions(+) create mode 100755 utils/lit/tests/Inputs/fake-externals/cd create mode 100755 utils/lit/tests/Inputs/fake-externals/diff create mode 100755 utils/lit/tests/Inputs/fake-externals/env create mode 100755 utils/lit/tests/Inputs/fake-externals/export create mode 100644 utils/lit/tests/Inputs/fake-externals/fake_external.py create mode 100755 utils/lit/tests/Inputs/fake-externals/mkdir create mode 100755 utils/lit/tests/Inputs/fake-externals/rm diff --git a/utils/lit/tests/Inputs/fake-externals/cd b/utils/lit/tests/Inputs/fake-externals/cd new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/cd @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/Inputs/fake-externals/diff b/utils/lit/tests/Inputs/fake-externals/diff new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/diff @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/Inputs/fake-externals/env b/utils/lit/tests/Inputs/fake-externals/env new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/env @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/Inputs/fake-externals/export b/utils/lit/tests/Inputs/fake-externals/export new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/export @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/Inputs/fake-externals/fake_external.py b/utils/lit/tests/Inputs/fake-externals/fake_external.py new file mode 100644 index 00000000000..1fdc2ee063c --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/fake_external.py @@ -0,0 +1,7 @@ +import os +import sys + +def execute(fileName): + sys.stderr.write("error: external '{}' command called unexpectedly\n" + .format(os.path.basename(fileName))); + sys.exit(1) diff --git a/utils/lit/tests/Inputs/fake-externals/mkdir b/utils/lit/tests/Inputs/fake-externals/mkdir new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/mkdir @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/Inputs/fake-externals/rm b/utils/lit/tests/Inputs/fake-externals/rm new file mode 100755 index 00000000000..9d9612dca4d --- /dev/null +++ b/utils/lit/tests/Inputs/fake-externals/rm @@ -0,0 +1,5 @@ +#!/usr/bin/env python + +import fake_external + +fake_external.execute(__file__) diff --git a/utils/lit/tests/lit.cfg b/utils/lit/tests/lit.cfg index 92f27b02188..26b3a1147d2 100644 --- a/utils/lit/tests/lit.cfg +++ b/utils/lit/tests/lit.cfg @@ -75,3 +75,14 @@ else: if not llvm_config: if sys.platform.startswith('win') or sys.platform.startswith('cygwin'): config.available_features.add('system-windows') + +# For each of lit's internal shell commands ('env', 'cd', 'diff', etc.), put +# a fake command that always fails at the start of PATH. This helps us check +# that we always use lit's internal version rather than some external version +# that might not be present or behave correctly on all platforms. Don't do +# this for 'echo' because an external version is used when it appears in a +# pipeline. Don't do this for ':' because it doesn't appear to be a valid file +# name under Windows. +test_bin = os.path.join(os.path.dirname(__file__), 'Inputs', 'fake-externals') +config.environment['PATH'] = os.path.pathsep.join((test_bin, + config.environment['PATH'])) -- 2.40.0