From 1076ab58ec92637a1a157d8dfbb7625d7bba6c40 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Fri, 21 Apr 2017 13:14:21 +0100 Subject: [PATCH] builder: Make builtin arg pruning work with > 1 arg The previous implementation would error out with "Unexpected EOF" which was caused by an underlying "array index out-of-bounds" error. The root cause was deleting items from the same array that was being iterated over. The iteration was unaware that the array size had changed, resulting in an error. The new implementation builds a new array instead of mutating a copy of the old one. Fixes: #32744 Signed-off-by: Dave Tucker --- builder/dockerfile/dispatchers.go | 9 ++++----- integration-cli/docker_cli_build_test.go | 6 +++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 8d2ed44aad..648ec50923 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -438,12 +438,11 @@ func run(req dispatchRequest) error { // these args are transparent so resulting image should be the same regardless of the value if len(cmdBuildEnv) > 0 { saveCmd = config.Cmd - tmpBuildEnv := make([]string, len(cmdBuildEnv)) - copy(tmpBuildEnv, cmdBuildEnv) - for i, env := range tmpBuildEnv { + var tmpBuildEnv []string + for _, env := range cmdBuildEnv { key := strings.SplitN(env, "=", 2)[0] - if req.builder.buildArgs.IsUnreferencedBuiltin(key) { - tmpBuildEnv = append(tmpBuildEnv[:i], tmpBuildEnv[i+1:]...) + if !req.builder.buildArgs.IsUnreferencedBuiltin(key) { + tmpBuildEnv = append(tmpBuildEnv, env) } } sort.Strings(tmpBuildEnv) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index cd996750cd..ed6633682b 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -4355,7 +4355,8 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) { ARG %s RUN echo "Testing Build Args!"`, envKey, explicitProxyKey) buildImage(imgName, - cli.WithFlags("--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), + cli.WithFlags("--build-arg", "https_proxy=https://proxy.example.com", + "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), "--build-arg", fmt.Sprintf("%s=%s", explicitProxyKey, explicitProxyVal), "--build-arg", proxy), build.WithDockerfile(dockerfile), @@ -4365,6 +4366,9 @@ func (s *DockerSuite) TestBuildTimeArgHistoryExclusions(c *check.C) { if strings.Contains(out, proxy) { c.Fatalf("failed to exclude proxy settings from history!") } + if strings.Contains(out, "https_proxy") { + c.Fatalf("failed to exclude proxy settings from history!") + } if !strings.Contains(out, fmt.Sprintf("%s=%s", envKey, envVal)) { c.Fatalf("explicitly defined ARG %s is not in output", explicitProxyKey) }