From 385901360df74e2c86d33300530d29f389f91acb Mon Sep 17 00:00:00 2001 From: Aditya R Date: Wed, 4 May 2022 10:16:07 +0530 Subject: [PATCH] imagebuildah,build: move deepcopy of args before we spawn goroutine To prevent concurrent read/write between maps perform deep copy of args before we spawn a goroutine. [NO NEW TESTS NEEDED] [NO TESTS NEEDED] Signed-off-by: Aditya R --- imagebuildah/build.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/imagebuildah/build.go b/imagebuildah/build.go index ea6331bcf5..cf0a7cfbac 100644 --- a/imagebuildah/build.go +++ b/imagebuildah/build.go @@ -242,6 +242,12 @@ func BuildDockerfiles(ctx context.Context, store storage.Store, options define.B if len(options.Platforms) > 1 { logPrefix = "[" + platforms.Format(platformSpec) + "] " } + // Deep copy args to prevent concurrent read/writes over Args. + argsCopy := make(map[string]string) + for key, value := range options.Args { + argsCopy[key] = value + } + platformOptions.Args = argsCopy builds.Go(func() error { thisID, thisRef, err := buildDockerfilesOnce(ctx, store, logger, logPrefix, platformOptions, paths, files) if err != nil { @@ -332,15 +338,7 @@ func BuildDockerfiles(ctx context.Context, store storage.Store, options define.B return id, ref, nil } -func buildDockerfilesOnce(ctx context.Context, store storage.Store, logger *logrus.Logger, logPrefix string, buildOpts define.BuildOptions, dockerfiles []string, dockerfilecontents [][]byte) (string, reference.Canonical, error) { - options := buildOpts - // Deep copy args to prevent concurrent read/writes over Args. - argsCopy := make(map[string]string) - for key, value := range options.Args { - argsCopy[key] = value - } - options.Args = argsCopy - +func buildDockerfilesOnce(ctx context.Context, store storage.Store, logger *logrus.Logger, logPrefix string, options define.BuildOptions, dockerfiles []string, dockerfilecontents [][]byte) (string, reference.Canonical, error) { mainNode, err := imagebuilder.ParseDockerfile(bytes.NewReader(dockerfilecontents[0])) if err != nil { return "", nil, errors.Wrapf(err, "error parsing main Dockerfile: %s", dockerfiles[0])