From f2c42a3958d12b45375aeb2384a3a8a103203c1c Mon Sep 17 00:00:00 2001
From: Kir Kolyshkin <kolyshkin@gmail.com>
Date: Tue, 31 Mar 2020 10:20:05 -0700
Subject: [PATCH] pkg/spec.InitFSMounts: fix mount opts in place

... rather than create a new slice and then make the caller
replace the original with the new one.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
---
 pkg/spec/spec.go    |  4 +---
 pkg/spec/storage.go | 22 +++++++++-------------
 pkg/specgen/oci.go  |  4 +---
 3 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/pkg/spec/spec.go b/pkg/spec/spec.go
index d4fd5976f1..194d2fcb31 100644
--- a/pkg/spec/spec.go
+++ b/pkg/spec/spec.go
@@ -371,11 +371,9 @@ func (config *CreateConfig) createConfigToOCISpec(runtime *libpod.Runtime, userM
 	// BIND MOUNTS
 	configSpec.Mounts = SupercedeUserMounts(userMounts, configSpec.Mounts)
 	// Process mounts to ensure correct options
-	finalMounts, err := InitFSMounts(configSpec.Mounts)
-	if err != nil {
+	if err := InitFSMounts(configSpec.Mounts); err != nil {
 		return nil, err
 	}
-	configSpec.Mounts = finalMounts
 
 	// BLOCK IO
 	blkio, err := config.CreateBlockIO()
diff --git a/pkg/spec/storage.go b/pkg/spec/storage.go
index 404d944328..335907d126 100644
--- a/pkg/spec/storage.go
+++ b/pkg/spec/storage.go
@@ -855,21 +855,19 @@ func SupercedeUserMounts(mounts []spec.Mount, configMount []spec.Mount) []spec.M
 }
 
 // Ensure mount options on all mounts are correct
-func InitFSMounts(inputMounts []spec.Mount) ([]spec.Mount, error) {
+func InitFSMounts(mounts []spec.Mount) error {
 	// We need to look up mounts so we can figure out the proper mount flags
 	// to apply.
 	systemMounts, err := pmount.GetMounts()
 	if err != nil {
-		return nil, errors.Wrapf(err, "error retrieving system mounts to look up mount options")
+		return errors.Wrapf(err, "error retrieving system mounts to look up mount options")
 	}
 
-	// TODO: We probably don't need to re-build the mounts array
-	var mounts []spec.Mount
-	for _, m := range inputMounts {
+	for i, m := range mounts {
 		if m.Type == TypeBind {
 			baseMnt, err := findMount(m.Source, systemMounts)
 			if err != nil {
-				return nil, errors.Wrapf(err, "error looking up mountpoint for mount %s", m.Source)
+				return errors.Wrapf(err, "error looking up mountpoint for mount %s", m.Source)
 			}
 			var noexec, nosuid, nodev bool
 			for _, baseOpt := range strings.Split(baseMnt.Opts, ",") {
@@ -890,21 +888,19 @@ func InitFSMounts(inputMounts []spec.Mount) ([]spec.Mount, error) {
 
 			opts, err := util.ProcessOptions(m.Options, false, defaultMountOpts)
 			if err != nil {
-				return nil, err
+				return err
 			}
-			m.Options = opts
+			mounts[i].Options = opts
 		}
 		if m.Type == TypeTmpfs && filepath.Clean(m.Destination) != "/dev" {
 			opts, err := util.ProcessOptions(m.Options, true, nil)
 			if err != nil {
-				return nil, err
+				return err
 			}
-			m.Options = opts
+			mounts[i].Options = opts
 		}
-
-		mounts = append(mounts, m)
 	}
-	return mounts, nil
+	return nil
 }
 
 // TODO: We could make this a bit faster by building a tree of the mountpoints
diff --git a/pkg/specgen/oci.go b/pkg/specgen/oci.go
index 2523f21b3c..db60dc25e0 100644
--- a/pkg/specgen/oci.go
+++ b/pkg/specgen/oci.go
@@ -215,11 +215,9 @@ func (s *SpecGenerator) toOCISpec(rt *libpod.Runtime, newImage *image.Image) (*s
 	// BIND MOUNTS
 	configSpec.Mounts = createconfig.SupercedeUserMounts(s.Mounts, configSpec.Mounts)
 	// Process mounts to ensure correct options
-	finalMounts, err := createconfig.InitFSMounts(configSpec.Mounts)
-	if err != nil {
+	if err := createconfig.InitFSMounts(configSpec.Mounts); err != nil {
 		return nil, err
 	}
-	configSpec.Mounts = finalMounts
 
 	// Add annotations
 	if configSpec.Annotations == nil {