From 3e891c1b6036f9df050cad8bf3517c7d9f82876e Mon Sep 17 00:00:00 2001
From: Matthew Heon <matthew.heon@pm.me>
Date: Sat, 19 Oct 2019 20:24:52 -0400
Subject: Wait for `mount` command to finish when mounting volume

command.Start() just starts the command. That catches some
errors, but the nasty ones - bad options and similar - happen
when the command runs. Use CombinedOutput() instead - it waits
for the command to exit, and thus catches non-0 exit of the
`mount` command (invalid options, for example).

STDERR from the `mount` command is directly used, which isn't
necessarily the best, but we can't really get much more info on
what went wrong.

Fixes #4303

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
---
 libpod/volume_internal_linux.go | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

(limited to 'libpod/volume_internal_linux.go')

diff --git a/libpod/volume_internal_linux.go b/libpod/volume_internal_linux.go
index 4c0332018..70eccbecb 100644
--- a/libpod/volume_internal_linux.go
+++ b/libpod/volume_internal_linux.go
@@ -3,8 +3,8 @@
 package libpod
 
 import (
-	"io/ioutil"
 	"os/exec"
+	"strings"
 
 	"github.com/containers/libpod/libpod/define"
 	"github.com/containers/libpod/pkg/rootless"
@@ -72,16 +72,10 @@ func (v *Volume) mount() error {
 	mountArgs = append(mountArgs, volDevice, v.config.MountPoint)
 	mountCmd := exec.Command(mountPath, mountArgs...)
 
-	errPipe, err := mountCmd.StderrPipe()
-	if err != nil {
-		return errors.Wrapf(err, "error getting stderr pipe for mount")
-	}
-	if err := mountCmd.Start(); err != nil {
-		out, err2 := ioutil.ReadAll(errPipe)
-		if err2 != nil {
-			return errors.Wrapf(err2, "error reading mount STDERR")
-		}
-		return errors.Wrapf(errors.New(string(out)), "error mounting volume %s", v.Name())
+	logrus.Debugf("Running mount command: %s %s", mountPath, strings.Join(mountArgs, " "))
+	if output, err := mountCmd.CombinedOutput(); err != nil {
+		logrus.Debugf("Mount failed with %v", err)
+		return errors.Wrapf(errors.Errorf(string(output)), "error mounting volume %s", v.Name())
 	}
 
 	logrus.Debugf("Mounted volume %s", v.Name())
-- 
cgit v1.2.3-54-g00ecf