Commit 4be93851 authored by Rick Arnold's avatar Rick Arnold Committed by Brad Fitzpatrick

io: prevent write to PipeWriter after Close

Return an ErrClosedPipe rather than allowing the write to proceed.

Fixes #5330.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/12541053
parent d3f36dbf
......@@ -74,6 +74,10 @@ func (p *pipe) write(b []byte) (n int, err error) {
p.l.Lock()
defer p.l.Unlock()
if p.werr != nil {
err = ErrClosedPipe
return
}
p.data = b
p.rwait.Signal()
for {
......
......@@ -268,3 +268,35 @@ func TestWriteNil(t *testing.T) {
ReadFull(r, b[0:2])
r.Close()
}
func TestWriteAfterWriterClose(t *testing.T) {
r, w := Pipe()
done := make(chan bool)
var writeErr error
go func() {
_, err := w.Write([]byte("hello"))
if err != nil {
t.Errorf("got error: %q; expected none", err)
}
w.Close()
_, writeErr = w.Write([]byte("world"))
done <- true
}()
buf := make([]byte, 100)
var result string
n, err := ReadFull(r, buf)
if err != nil && err != ErrUnexpectedEOF {
t.Fatalf("got: %q; want: %q", err, ErrUnexpectedEOF)
}
result = string(buf[0:n])
<-done
if result != "hello" {
t.Errorf("got: %q; want: %q", result, "hello")
}
if writeErr != ErrClosedPipe {
t.Errorf("got: %q; want: %q", writeErr, ErrClosedPipe)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment