aboutsummaryrefslogtreecommitdiff
path: root/plugin/forward/connect.go
diff options
context:
space:
mode:
authorGravatar Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> 2019-03-01 17:40:52 +0300
committerGravatar Miek Gieben <miek@miek.nl> 2019-03-01 14:40:52 +0000
commite3e3249016304506b004caf3b84bd291018760c9 (patch)
tree984c5d47a9c9496aa9bb5db2e32aca27140fcc62 /plugin/forward/connect.go
parent352a0423624688e127ddc79615549a5ac59a3aec (diff)
downloadcoredns-e3e3249016304506b004caf3b84bd291018760c9.tar.gz
coredns-e3e3249016304506b004caf3b84bd291018760c9.tar.zst
coredns-e3e3249016304506b004caf3b84bd291018760c9.zip
plugin/forward: check message Id when reading from upstream server (#2637)
Diffstat (limited to '')
-rw-r--r--plugin/forward/connect.go19
1 files changed, 13 insertions, 6 deletions
diff --git a/plugin/forward/connect.go b/plugin/forward/connect.go
index 55deeae1e..8fde2224b 100644
--- a/plugin/forward/connect.go
+++ b/plugin/forward/connect.go
@@ -103,14 +103,21 @@ func (p *Proxy) Connect(ctx context.Context, state request.Request, opts options
return nil, err
}
+ var ret *dns.Msg
conn.SetReadDeadline(time.Now().Add(readTimeout))
- ret, err := conn.ReadMsg()
- if err != nil {
- conn.Close() // not giving it back
- if err == io.EOF && cached {
- return nil, ErrCachedClosed
+ for {
+ ret, err = conn.ReadMsg()
+ if err != nil {
+ conn.Close() // not giving it back
+ if err == io.EOF && cached {
+ return nil, ErrCachedClosed
+ }
+ return ret, err
+ }
+ // drop out-of-order responses
+ if state.Req.Id == ret.Id {
+ break
}
- return ret, err
}
p.transport.Yield(conn)