diff --git a/libcontainer/env.go b/libcontainer/env.go index 71b2f69d0..96a357c20 100644 --- a/libcontainer/env.go +++ b/libcontainer/env.go @@ -22,10 +22,7 @@ import ( // // Returns the prepared environment. func prepareEnv(env []string, uid int) ([]string, error) { - if env == nil { - return nil, nil - } - var homeIsSet bool + homeIsSet := false // Deduplication code based on dedupEnv from Go 1.22 os/exec. diff --git a/libcontainer/env_test.go b/libcontainer/env_test.go index 18dc52e88..f7b3a21cf 100644 --- a/libcontainer/env_test.go +++ b/libcontainer/env_test.go @@ -21,6 +21,10 @@ func TestPrepareEnv(t *testing.T) { tests := []struct { env, wantEnv []string }{ + { + env: nil, + wantEnv: []string{home}, + }, { env: []string{}, wantEnv: []string{home}, diff --git a/tests/integration/env.bats b/tests/integration/env.bats index cb984942e..e40184d55 100644 --- a/tests/integration/env.bats +++ b/tests/integration/env.bats @@ -95,3 +95,51 @@ function teardown() { # [ "$(wc -l <<<"$output")" -eq 4 ] } + +# Check that runc exec -p process.json takes env from +# process.json only, not from config.json, and that HOME +# is always set. +@test "env [runc exec -p]" { + runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox + [ "$status" -eq 0 ] + + cat <<_EOF_ >process.json +{ + "terminal": false, + "args": [ + "/bin/env" + ], + "cwd": "/", + "env": [ + "FOO=bar" + ] +} +_EOF_ + + runc exec -p process.json test_busybox + [ "$status" -eq 0 ] + # Env should have entries from process.json. + [[ "$output" == *'FOO=bar'* ]] + # ...and HOME set from container's /etc/passwd. + [[ "$output" == *'HOME=/root'* ]] + # Env should NOT contain entries from config.json. + [[ "$output" != *'TERM='* ]] + [[ "$output" != *'PATH='* ]] +} + +@test "env HOME is set for runc exec -p with no process.env" { + runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox + [ "$status" -eq 0 ] + + # "env" is not set. + cat <<_EOF_ >process.json +{ + "args": ["/bin/env"], + "cwd": "/" +} +_EOF_ + runc exec -p process.json test_busybox + [ "$status" -eq 0 ] + # Env should have HOME set from container's /etc/passwd. + [[ "$output" == *'HOME=/root'* ]] +} diff --git a/tests/integration/exec.bats b/tests/integration/exec.bats index 11e4bb473..5d936f402 100644 --- a/tests/integration/exec.bats +++ b/tests/integration/exec.bats @@ -100,8 +100,12 @@ function teardown() { runc exec --env RUNC_EXEC_TEST=true test_busybox env [ "$status" -eq 0 ] - - [[ ${output} == *"RUNC_EXEC_TEST=true"* ]] + [[ "$output" == *"RUNC_EXEC_TEST=true"* ]] + # Env should inherit what's in config.json. + [[ "$output" == *'PATH='* ]] + [[ "$output" == *'TERM='* ]] + # Env should have HOME set from container's /etc/passwd. + [[ "$output" == *'HOME='* ]] } @test "runc exec --user" {