Skip to content

Commit

Permalink
imagebuildah,build: move deepcopy of args before we spawn goroutine
Browse files Browse the repository at this point in the history
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 <arajan@redhat.com>
  • Loading branch information
flouthoc committed May 4, 2022
1 parent b669e4b commit 3859013
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions imagebuildah/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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])
Expand Down

0 comments on commit 3859013

Please sign in to comment.