dont panic when using varlink commit and uppercase image names

when using an upper case image name for container commit, we observed
panics due to a channel closing early.

Fixes: #3897

Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
baude 2019-08-29 14:07:02 -05:00
parent 4e209fc10a
commit 2fb6cc2cea
4 changed files with 54 additions and 2 deletions

View file

@ -563,7 +563,6 @@ func (i *LibpodAPI) Commit(call iopodman.VarlinkCall, name, imageName string, ch
}
c := make(chan error)
defer close(c)
go func() {
newImage, err = ctr.Commit(getContext(), imageName, options)
@ -571,6 +570,7 @@ func (i *LibpodAPI) Commit(call iopodman.VarlinkCall, name, imageName string, ch
c <- err
}
c <- nil
close(c)
}()
// reply is the func being sent to the output forwarder. in this case it is replying

47
test/endpoint/commit.go Normal file
View file

@ -0,0 +1,47 @@
package endpoint
import (
"encoding/json"
"os"
. "github.com/containers/libpod/test/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Podman commit", func() {
var (
tempdir string
err error
endpointTest *EndpointTestIntegration
)
BeforeEach(func() {
tempdir, err = CreateTempDirInTempDir()
if err != nil {
os.Exit(1)
}
endpointTest = Setup(tempdir)
endpointTest.StartVarlinkWithCache()
})
AfterEach(func() {
endpointTest.Cleanup()
})
It("ensure commit with uppercase image name does not panic", func() {
body := make(map[string]string)
body["image_name"] = "FOO"
body["format"] = "oci"
body["name"] = "top"
b, err := json.Marshal(body)
Expect(err).To(BeNil())
// run the container to be committed
_ = endpointTest.startTopContainer("top")
result := endpointTest.Varlink("Commit", string(b), false)
// This indicates an error occured
Expect(len(result.StdErrToString())).To(BeNumerically(">", 0))
})
})

View file

@ -189,6 +189,11 @@ func (p *EndpointTestIntegration) Varlink(endpoint, message string, more bool) *
return &EndpointSession{session}
}
func (s *EndpointSession) StdErrToString() string {
fields := strings.Fields(fmt.Sprintf("%s", s.Err.Contents()))
return strings.Join(fields, " ")
}
func (s *EndpointSession) OutputToString() string {
fields := strings.Fields(fmt.Sprintf("%s", s.Out.Contents()))
return strings.Join(fields, " ")

View file

@ -8,7 +8,7 @@ import (
. "github.com/onsi/gomega"
)
var _ = Describe("Podman pull", func() {
var _ = Describe("Podman exists", func() {
var (
tempdir string
err error