diff options
author | 2019-03-01 17:40:52 +0300 | |
---|---|---|
committer | 2019-03-01 14:40:52 +0000 | |
commit | e3e3249016304506b004caf3b84bd291018760c9 (patch) | |
tree | 984c5d47a9c9496aa9bb5db2e32aca27140fcc62 /plugin/forward/connect.go | |
parent | 352a0423624688e127ddc79615549a5ac59a3aec (diff) | |
download | coredns-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.go | 19 |
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) |