diff options
author | Matthew Heon <matthew.heon@pm.me> | 2019-09-05 17:30:35 -0400 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2019-09-05 17:47:11 -0400 |
commit | 3a09956dff0d475e8b7e988a6fdcda59e242d297 (patch) | |
tree | 44c02a2c51a4d553c92c68412b9e32df852f6b5e | |
parent | cef5bec06b200ffa5caed46db296e55fb7d72376 (diff) | |
download | podman-3a09956dff0d475e8b7e988a6fdcda59e242d297.tar.gz podman-3a09956dff0d475e8b7e988a6fdcda59e242d297.tar.bz2 podman-3a09956dff0d475e8b7e988a6fdcda59e242d297.zip |
Ensure good defaults on blank c/storage configuration
If c/storage paths are explicitly set to "" (the empty string) it
will use compiled-in defaults. However, it won't tell us this via
`storage.GetDefaultStoreOptions()` - we just get the empty string
(which can put our defaults, some of which are relative to
c/storage, in a bad spot).
Hardcode a sane default for cases like this. Furthermore, add
some sanity checks to paths, to ensure we don't use relative
paths for core parts of libpod.
Fixes #3952
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
-rw-r--r-- | libpod/runtime.go | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/libpod/runtime.go b/libpod/runtime.go index 28774773e..323a46266 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -281,10 +281,17 @@ func defaultRuntimeConfig() (RuntimeConfig, error) { if err != nil { return RuntimeConfig{}, err } + graphRoot := storeOpts.GraphRoot + if graphRoot == "" { + logrus.Warnf("Storage configuration is unset - using hardcoded default paths") + graphRoot = "/var/lib/containers/storage" + } + volumePath := filepath.Join(graphRoot, "volumes") + staticDir := filepath.Join(graphRoot, "libpod") return RuntimeConfig{ // Leave this empty so containers/storage will use its defaults StorageConfig: storage.StoreOptions{}, - VolumePath: filepath.Join(storeOpts.GraphRoot, "volumes"), + VolumePath: volumePath, ImageDefaultTransport: DefaultTransport, StateType: BoltDBStateStore, OCIRuntime: "runc", @@ -314,7 +321,7 @@ func defaultRuntimeConfig() (RuntimeConfig, error) { }, InitPath: define.DefaultInitPath, CgroupManager: SystemdCgroupsManager, - StaticDir: filepath.Join(storeOpts.GraphRoot, "libpod"), + StaticDir: staticDir, TmpDir: "", MaxLogSize: -1, NoPivotRoot: false, @@ -789,6 +796,20 @@ func probeConmon(conmonBinary string) error { // Make a new runtime based on the given configuration // Sets up containers/storage, state store, OCI runtime func makeRuntime(ctx context.Context, runtime *Runtime) (err error) { + // Let's sanity-check some paths first. + // Relative paths can cause nasty bugs, because core paths we use could + // shift between runs (or even parts of the program - the OCI runtime + // uses a different working directory than we do, for example. + if !filepath.IsAbs(runtime.config.StaticDir) { + return errors.Wrapf(define.ErrInvalidArg, "static directory must be an absolute path - instead got %q", runtime.config.StaticDir) + } + if !filepath.IsAbs(runtime.config.TmpDir) { + return errors.Wrapf(define.ErrInvalidArg, "temporary directory must be an absolute path - instead got %q", runtime.config.TmpDir) + } + if !filepath.IsAbs(runtime.config.VolumePath) { + return errors.Wrapf(define.ErrInvalidArg, "volume path must be an absolute path - instead got %q", runtime.config.VolumePath) + } + // Find a working conmon binary foundConmon := false foundOutdatedConmon := false |