@@ -46,6 +46,7 @@ const (
4646)
4747
4848var (
49+ errNoQuestion = errors .New ("no question" )
4950 errCacheResponseEmpty = errors .New ("empty cache response" )
5051 errCacheResponseMismatch = errors .New ("cache response mismatch" )
5152)
@@ -259,6 +260,10 @@ func (cb *cache) put(response []byte, s *Summary) (ok bool) {
259260}
260261
261262func asResponse (q * dns.Msg , v * cres , fresh bool ) (r []byte , s * Summary , err error ) {
263+ if q == nil {
264+ err = errNoQuestion
265+ return
266+ }
262267 a := v .ans
263268 if a == nil {
264269 err = errCacheResponseEmpty
@@ -294,37 +299,34 @@ func (t *ctransport) Type() string {
294299 return t .Transport .Type ()
295300}
296301
297- type anssummary struct {
298- ans []byte
299- s * Summary
300- }
301-
302302func (t * ctransport ) fetch (network string , q []byte , msg * dns.Msg , summary * Summary , cb * cache , key string ) (r []byte , err error ) {
303303 sendRequest := func (async bool ) ([]byte , error ) {
304- var s * Summary
304+ var finalsumm * Summary
305305 if async {
306- s = new (Summary )
306+ finalsumm = new (Summary )
307307 } else {
308- s = summary
308+ finalsumm = summary
309309 }
310310
311- s .ID = t .Transport .ID ()
312- s .Type = t .Transport .Type ()
311+ finalsumm .ID = t .Transport .ID ()
312+ finalsumm .Type = t .Transport .Type ()
313313
314314 rv := t .reqbarrier .Do (key , func () (any , error ) {
315- ans , err := t .Transport .Query (network , q , s )
316- cb .put (ans , s )
317- return & anssummary {ans , s }, err
315+ ans , err := t .Transport .Query (network , q , finalsumm )
316+ cb .put (ans , finalsumm )
317+ return & cres {ans : xdns . AsMsg ( ans ) , s : finalsumm }, err
318318 })
319319
320- asmm , ok := rv .Val .(* anssummary )
320+ cachedres , ok := rv .Val .(* cres )
321321 if ! ok {
322322 return nil , errCacheResponseMismatch
323323 }
324- // fill summary regardless of rv.Err
325- asmm .s .FillInto (s ) // asmm.s may be equal to s
326324
327- return asmm .ans , rv .Err
325+ finalres , origsumm , finalerr := asResponse (msg , cachedres , true )
326+ // fill summary regardless of errors
327+ origsumm .FillInto (finalsumm ) // origsumm may be equal to s
328+
329+ return finalres , errors .Join (rv .Err , finalerr )
328330 }
329331
330332 // check if underlying transport can connect fine, if not treat cache
0 commit comments