From e3e3249016304506b004caf3b84bd291018760c9 Mon Sep 17 00:00:00 2001 From: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> Date: Fri, 1 Mar 2019 17:40:52 +0300 Subject: [PATCH] plugin/forward: check message Id when reading from upstream server (#2637) --- plugin/forward/connect.go | 19 +++++++++++++------ 1 file 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)