summaryrefslogtreecommitdiff
path: root/vendor/github.com/miekg/dns/xfr.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/miekg/dns/xfr.go')
-rw-r--r--vendor/github.com/miekg/dns/xfr.go18
1 files changed, 14 insertions, 4 deletions
diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go
index 0a831c880..05b3c5add 100644
--- a/vendor/github.com/miekg/dns/xfr.go
+++ b/vendor/github.com/miekg/dns/xfr.go
@@ -80,8 +80,13 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) {
func (t *Transfer) inAxfr(q *Msg, c chan *Envelope) {
first := true
- defer t.Close()
- defer close(c)
+ defer func() {
+ // First close the connection, then the channel. This allows functions blocked on
+ // the channel to assume that the connection is closed and no further operations are
+ // pending when they resume.
+ t.Close()
+ close(c)
+ }()
timeout := dnsTimeout
if t.ReadTimeout != 0 {
timeout = t.ReadTimeout
@@ -131,8 +136,13 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) {
axfr := true
n := 0
qser := q.Ns[0].(*SOA).Serial
- defer t.Close()
- defer close(c)
+ defer func() {
+ // First close the connection, then the channel. This allows functions blocked on
+ // the channel to assume that the connection is closed and no further operations are
+ // pending when they resume.
+ t.Close()
+ close(c)
+ }()
timeout := dnsTimeout
if t.ReadTimeout != 0 {
timeout = t.ReadTimeout