diff options
author | Matthew Heon <matthew.heon@pm.me> | 2019-01-18 10:27:51 -0500 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2019-01-18 10:27:51 -0500 |
commit | fc52b0423b67cc4a2caafc5dab48832d5bedc1ab (patch) | |
tree | 1fd428ff173e0678a821501b8e478bb7a946e7f0 /libpod | |
parent | 7f19e5fb23b785399d49166171b6af7a34edf437 (diff) | |
download | podman-fc52b0423b67cc4a2caafc5dab48832d5bedc1ab.tar.gz podman-fc52b0423b67cc4a2caafc5dab48832d5bedc1ab.tar.bz2 podman-fc52b0423b67cc4a2caafc5dab48832d5bedc1ab.zip |
Do not unmarshal into c.config.Spec
We try to keep c.config immutable, but Go doesn't really agree
with me that things other than strings and ints can be immutable,
so occasionally things like this slip through.
When unmarshalling the OCI spec from disk, do it into a separate
struct, to ensure we don't make lasting modifications to the
spec in the Container struct (which could affect container
restart).
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/container.go | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/libpod/container.go b/libpod/container.go index 95f7a2972..b5f6a29ba 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -415,14 +415,15 @@ func (c *Container) Spec() *spec.Spec { // config does not exist (e.g., because the container was never started) return // the spec from the config. func (c *Container) specFromState() (*spec.Spec, error) { - spec := c.config.Spec + returnSpec := c.config.Spec if f, err := os.Open(c.state.ConfigPath); err == nil { + returnSpec = new(spec.Spec) content, err := ioutil.ReadAll(f) if err != nil { return nil, errors.Wrapf(err, "error reading container config") } - if err := json.Unmarshal([]byte(content), &spec); err != nil { + if err := json.Unmarshal([]byte(content), &returnSpec); err != nil { return nil, errors.Wrapf(err, "error unmarshalling container config") } } else { @@ -432,7 +433,7 @@ func (c *Container) specFromState() (*spec.Spec, error) { } } - return spec, nil + return returnSpec, nil } // ID returns the container's ID |