mirror of https://github.com/docker/cli.git
Merge pull request #4081 from vvoland/windows-drive-cwd-env
stack/loader: Ignore cmd.exe special env variables
This commit is contained in:
commit
677aac9011
|
@ -5,6 +5,7 @@ import (
|
|||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
|
@ -104,9 +105,22 @@ func GetConfigDetails(composefiles []string, stdin io.Reader) (composetypes.Conf
|
|||
func buildEnvironment(env []string) (map[string]string, error) {
|
||||
result := make(map[string]string, len(env))
|
||||
for _, s := range env {
|
||||
if runtime.GOOS == "windows" && len(s) > 0 {
|
||||
// cmd.exe can have special environment variables which names start with "=".
|
||||
// They are only there for MS-DOS compatibility and we should ignore them.
|
||||
// See TestBuildEnvironment for examples.
|
||||
//
|
||||
// https://ss64.com/nt/syntax-variables.html
|
||||
// https://devblogs.microsoft.com/oldnewthing/20100506-00/?p=14133
|
||||
// https://github.com/docker/cli/issues/4078
|
||||
if s[0] == '=' {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
k, v, ok := strings.Cut(s, "=")
|
||||
if !ok || k == "" {
|
||||
return result, errors.Errorf("unexpected environment %q", s)
|
||||
return result, errors.Errorf("unexpected environment variable '%s'", s)
|
||||
}
|
||||
// value may be set, but empty if "s" is like "K=", not "K".
|
||||
result[k] = v
|
||||
|
|
|
@ -3,6 +3,7 @@ package loader
|
|||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
|
@ -45,3 +46,34 @@ services:
|
|||
assert.Check(t, is.Equal("3.0", details.ConfigFiles[0].Config["version"]))
|
||||
assert.Check(t, is.Len(details.Environment, len(os.Environ())))
|
||||
}
|
||||
|
||||
func TestBuildEnvironment(t *testing.T) {
|
||||
inputEnv := []string{
|
||||
"LEGIT_VAR=LEGIT_VALUE",
|
||||
"EMPTY_VARIABLE=",
|
||||
}
|
||||
|
||||
if runtime.GOOS == "windows" {
|
||||
inputEnv = []string{
|
||||
"LEGIT_VAR=LEGIT_VALUE",
|
||||
|
||||
// cmd.exe has some special environment variables which start with "=".
|
||||
// These should be ignored as they're only there for MS-DOS compatibility.
|
||||
"=ExitCode=00000041",
|
||||
"=ExitCodeAscii=A",
|
||||
`=C:=C:\some\dir`,
|
||||
`=D:=D:\some\different\dir`,
|
||||
`=X:=X:\`,
|
||||
`=::=::\`,
|
||||
|
||||
"EMPTY_VARIABLE=",
|
||||
}
|
||||
}
|
||||
|
||||
env, err := buildEnvironment(inputEnv)
|
||||
assert.NilError(t, err)
|
||||
|
||||
assert.Check(t, is.Len(env, 2))
|
||||
assert.Check(t, is.Equal("LEGIT_VALUE", env["LEGIT_VAR"]))
|
||||
assert.Check(t, is.Equal("", env["EMPTY_VARIABLE"]))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue