Explicitly panic after (*response).Close (#769)

* Explicitly panic after (*response).Close

* Prefix panics with package name

* Harden TestResponseAfterClose by comparing panic message
This commit is contained in:
Tom Thorogood 2018-10-04 16:09:21 +09:30 committed by Miek Gieben
parent c10ce5142a
commit 008c8ca764
2 changed files with 43 additions and 5 deletions

View File

@ -753,24 +753,33 @@ func (w *response) Write(m []byte) (int, error) {
n, err := io.Copy(w.tcp, bytes.NewReader(m))
return int(n), err
default:
panic("dns: Write called after Close")
}
panic("not reached")
}
// LocalAddr implements the ResponseWriter.LocalAddr method.
func (w *response) LocalAddr() net.Addr {
if w.tcp != nil {
switch {
case w.udp != nil:
return w.udp.LocalAddr()
case w.tcp != nil:
return w.tcp.LocalAddr()
default:
panic("dns: LocalAddr called after Close")
}
return w.udp.LocalAddr()
}
// RemoteAddr implements the ResponseWriter.RemoteAddr method.
func (w *response) RemoteAddr() net.Addr {
if w.tcp != nil {
switch {
case w.udpSession != nil:
return w.udpSession.RemoteAddr()
case w.tcp != nil:
return w.tcp.RemoteAddr()
default:
panic("dns: RemoteAddr called after Close")
}
return w.udpSession.RemoteAddr()
}
// TsigStatus implements the ResponseWriter.TsigStatus method.

View File

@ -990,6 +990,35 @@ func TestServerRoundtripTsig(t *testing.T) {
}
}
func TestResponseAfterClose(t *testing.T) {
testPanic := func(name string, fn func()) {
defer func() {
expect := fmt.Sprintf("dns: %s called after Close", name)
if err := recover(); err == nil {
t.Errorf("expected panic from %s after Close", name)
} else if err != expect {
t.Errorf("expected explicit panic from %s after Close, expected %q, got %q", name, expect, err)
}
}()
fn()
}
rw := &response{
tcp: nil, // Close sets tcp to nil
udp: nil,
udpSession: nil,
}
testPanic("Write", func() {
rw.Write(make([]byte, 2))
})
testPanic("LocalAddr", func() {
rw.LocalAddr()
})
testPanic("RemoteAddr", func() {
rw.RemoteAddr()
})
}
type ExampleFrameLengthWriter struct {
Writer
}