commit 7b5896702bd2951541af27925620172edb5d3505 Author: Michael Crosby Date: Tue Jan 26 15:00:07 2016 -0800 Update libcontainer to 3d8a20bb772defc28c355534d83 Fixes #14203 This bump fixes the issue of having the container's pipes connection reset by peer because of using the json.Encoder and having a \n added to the output. Signed-off-by: Michael Crosby Index: docker-1.9.1/hack/vendor.sh =================================================================== --- docker-1.9.1.orig/hack/vendor.sh +++ docker-1.9.1/hack/vendor.sh @@ -48,7 +48,7 @@ clone git github.com/agl/ed25519 d2b94fd # this runc commit from branch relabel_fix_docker_1.9.1, pls remove it when you # update next time -clone git github.com/opencontainers/runc 1349b37bd56f4f5ce2690b5b2c0f53f88a261c67 # libcontainer +clone git github.com/opencontainers/runc 3d8a20bb772defc28c355534d83486416d1719b4 # libcontainer # libcontainer deps (see src/github.com/opencontainers/runc/Godeps/Godeps.json) clone git github.com/coreos/go-systemd v3 clone git github.com/godbus/dbus v2 Index: docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/container_linux.go =================================================================== --- docker-1.9.1.orig/vendor/src/github.com/opencontainers/runc/libcontainer/container_linux.go +++ docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/container_linux.go @@ -18,6 +18,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/criurpc" + "github.com/opencontainers/runc/libcontainer/utils" ) const stdioFdCount = 3 @@ -863,7 +864,7 @@ func (c *linuxContainer) updateState(pro } defer f.Close() os.Remove(filepath.Join(c.root, "checkpoint")) - return json.NewEncoder(f).Encode(state) + return utils.WriteJSON(f, state) } func (c *linuxContainer) currentStatus() (Status, error) { Index: docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/factory_linux.go =================================================================== --- docker-1.9.1.orig/vendor/src/github.com/opencontainers/runc/libcontainer/factory_linux.go +++ docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/factory_linux.go @@ -5,7 +5,6 @@ package libcontainer import ( "encoding/json" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -19,6 +18,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups/systemd" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs/validate" + "github.com/opencontainers/runc/libcontainer/utils" ) const ( @@ -225,10 +225,7 @@ func (l *LinuxFactory) StartInitializati // if we have an error during the initialization of the container's init then send it back to the // parent process in the form of an initError. if err != nil { - // ensure that any data sent from the parent is consumed so it doesn't - // receive ECONNRESET when the child writes to the pipe. - ioutil.ReadAll(pipe) - if err := json.NewEncoder(pipe).Encode(newSystemError(err)); err != nil { + if err := utils.WriteJSON(pipe, newSystemError(err)); err != nil { panic(err) } } Index: docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/process_linux.go =================================================================== --- docker-1.9.1.orig/vendor/src/github.com/opencontainers/runc/libcontainer/process_linux.go +++ docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/process_linux.go @@ -15,6 +15,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/system" + "github.com/opencontainers/runc/libcontainer/utils" ) type parentProcess interface { @@ -71,7 +72,7 @@ func (p *setnsProcess) start() (err erro return newSystemError(err) } } - if err := json.NewEncoder(p.parentPipe).Encode(p.config); err != nil { + if err := utils.WriteJSON(p.parentPipe, p.config); err != nil { return newSystemError(err) } if err := syscall.Shutdown(int(p.parentPipe.Fd()), syscall.SHUT_WR); err != nil { @@ -262,7 +263,7 @@ func (p *initProcess) startTime() (strin func (p *initProcess) sendConfig() error { // send the state to the container's init process then shutdown writes for the parent - if err := json.NewEncoder(p.parentPipe).Encode(p.config); err != nil { + if err := utils.WriteJSON(p.parentPipe, p.config); err != nil { return err } // shutdown writes for the parent side of the pipe Index: docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/utils/utils.go =================================================================== --- docker-1.9.1.orig/vendor/src/github.com/opencontainers/runc/libcontainer/utils/utils.go +++ docker-1.9.1/vendor/src/github.com/opencontainers/runc/libcontainer/utils/utils.go @@ -3,6 +3,7 @@ package utils import ( "crypto/rand" "encoding/hex" + "encoding/json" "io" "path/filepath" "syscall" @@ -43,3 +44,13 @@ func ExitStatus(status syscall.WaitStatu } return status.ExitStatus() } + +// WriteJSON writes the provided struct v to w using standard json marshaling +func WriteJSON(w io.Writer, v interface{}) error { + data, err := json.Marshal(v) + if err != nil { + return err + } + _, err = w.Write(data) + return err +}