commit 37a617f5f2faa5dc934567a3124739da93711614
parent 5922bf2f21d20e4b60fb99d37b196779e0f3c2ba
Author: Richard Ipsum <richardipsum@vx21.xyz>
Date:   Sat, 30 Nov 2019 03:45:01 +0000
Sanitise test environment
Diffstat:
2 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/tyarn.c b/tyarn.c
@@ -490,8 +490,17 @@ static int tyarn_parse_args(lua_State *L)
     lua_createtable(L, 0, envoptsn);
 
     for (size_t i = 0; i < envoptsn; i++) {
-        lua_pushstring(L, envopts[i]);
-        lua_rawseti(L, -2, i + 1);
+        char *p = strchr(envopts[i], '=');
+        if (p == NULL) {
+            fprintf(stderr, "%s: invalid argument to --env: %s\n",
+                    buf[0], envopts[i]);
+            exit(1);
+        }
+        char *key = envopts[i];
+        char *value = p + 1;
+        *p = '\0';
+        lua_pushstring(L, value);
+        lua_setfield(L, -2, key);
     }
 
     for (int i = 0; i < bufn; i++) {
diff --git a/tyarn.in b/tyarn.in
@@ -270,12 +270,31 @@ function load_shell_library(path)
     return fh:read('*all')
 end
 
+function cleanenv()
+    return {
+        ['TERM'] = 'dumb',
+        ['SHELL'] = '/bin/sh',
+        ['LC_ALL'] = 'C',
+        ['USER'] = 'tomjon',
+        ['USERNAME'] = 'tomjon',
+        ['LOGNAME'] = 'tomjon'
+    }
+end
+
+function env_from_table(env)
+    local e = {}
+    for k, v in pairs(env) do
+        table.insert(e, string.format('%s=%s', k, v))
+    end
+    return e
+end
+
 function run_step(scenario_dir, datadir, implementations, scenario_key, step, shell_prelude)
     success = true
     skip_scenario = false
-    env = {}
+    env = cleanenv()
     shell_script_lines = {}
-    table.insert(env, string.format("DATADIR=%s", datadir))
+    env['DATADIR'] = datadir
     debug(string.format("Run step %s", step))
 
     step_impl, step_captures = find_matching_implementation(implementations, step)
@@ -288,11 +307,11 @@ function run_step(scenario_dir, datadir, implementations, scenario_key, step, sh
     end
 
     for n, capture in ipairs(step_captures) do
-        table.insert(env, string.format('MATCH_%d=%s', n, capture))
+        env[string.format('MATCH_%d', n)] = capture
     end
 
     for k, v in pairs(parsed_env) do
-        table.insert(env, v)
+        env[k] = v
     end
 
     for _, impl_line in ipairs(step_impl) do
@@ -322,7 +341,7 @@ function run_step(scenario_dir, datadir, implementations, scenario_key, step, sh
     debug('shell_script_str:', shell_script_str)
 
     cmd = {"/usr/bin/env", parsed_args["shell"] or DEFAULT_SHELL, path}
-    ret, exit_code, stdout, stderr = tyarn.exec(cmd, env, datadir)
+    ret, exit_code, stdout, stderr = tyarn.exec(cmd, env_from_table(env), datadir)
     if parsed_args["show_stdout"] and string.len(stdout) > 0 then
         io.stderr:write("STDOUT:\n" .. stdout)
     end