daemon/volumes_linux.go
589a0afa
 package daemon
 
 import (
 	"strings"
 
 	"github.com/docker/docker/api/types/mount"
 	"github.com/docker/docker/errdefs"
 	"github.com/pkg/errors"
 )
 
 // validateBindDaemonRoot ensures that if a given mountpoint's source is within
 // the daemon root path, that the propagation is setup to prevent a container
1e49fdca
 // from holding private references to a mount within the daemon root, which
589a0afa
 // can cause issues when the daemon attempts to remove the mountpoint.
 func (daemon *Daemon) validateBindDaemonRoot(m mount.Mount) (bool, error) {
 	if m.Type != mount.TypeBind {
 		return false, nil
 	}
 
 	// check if the source is within the daemon root, or if the daemon root is within the source
 	if !strings.HasPrefix(m.Source, daemon.root) && !strings.HasPrefix(daemon.root, m.Source) {
 		return false, nil
 	}
 
 	if m.BindOptions == nil {
 		return true, nil
 	}
 
 	switch m.BindOptions.Propagation {
 	case mount.PropagationRSlave, mount.PropagationRShared, "":
 		return m.BindOptions.Propagation == "", nil
 	default:
 	}
 
 	return false, errdefs.InvalidParameter(errors.Errorf(`invalid mount config: must use either propagation mode "rslave" or "rshared" when mount source is within the daemon root, daemon root: %q, bind mount source: %q, propagation: %q`, daemon.root, m.Source, m.BindOptions.Propagation))
 }