Merge pull request #2161 from IRCody/cio_panic

Fix panics in cio/io_unix.go
This commit is contained in:
Stephen Day 2018-02-26 13:45:45 -08:00 committed by GitHub
commit 0273e970a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 3 deletions

View File

@ -114,17 +114,24 @@ func openFifos(ctx context.Context, fifos *FIFOSet) (pipes, error) {
if f.Stdin, err = fifo.OpenFifo(ctx, fifos.Stdin, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
return f, errors.Wrapf(err, "failed to open stdin fifo")
}
defer func() {
if err != nil && f.Stdin != nil {
f.Stdin.Close()
}
}()
}
if fifos.Stdout != "" {
if f.Stdout, err = fifo.OpenFifo(ctx, fifos.Stdout, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
f.Stdin.Close()
return f, errors.Wrapf(err, "failed to open stdout fifo")
}
defer func() {
if err != nil && f.Stdout != nil {
f.Stdout.Close()
}
}()
}
if fifos.Stderr != "" {
if f.Stderr, err = fifo.OpenFifo(ctx, fifos.Stderr, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
f.Stdin.Close()
f.Stdout.Close()
return f, errors.Wrapf(err, "failed to open stderr fifo")
}
}

41
cio/io_unix_test.go Normal file
View File

@ -0,0 +1,41 @@
// +build !windows
package cio
import (
"context"
"path/filepath"
"testing"
"github.com/gotestyourself/gotestyourself/assert"
)
func TestOpenFifos(t *testing.T) {
scenarios := []*FIFOSet{
{
Config: Config{
Stdin: "",
Stdout: filepath.Join("This/does/not/exist", "test-stdout"),
Stderr: filepath.Join("This/does/not/exist", "test-stderr"),
},
},
{
Config: Config{
Stdin: filepath.Join("This/does/not/exist", "test-stdin"),
Stdout: "",
Stderr: filepath.Join("This/does/not/exist", "test-stderr"),
},
},
{
Config: Config{
Stdin: "",
Stdout: "",
Stderr: filepath.Join("This/does/not/exist", "test-stderr"),
},
},
}
for _, scenario := range scenarios {
_, err := openFifos(context.Background(), scenario)
assert.Assert(t, err != nil, scenario)
}
}