@@ -260,6 +260,30 @@ func updateTTL(msg *dns.Msg, expiration time.Time) {
260260 }
261261}
262262
263+ func cloneRRs (src []dns.RR ) []dns.RR {
264+ if src == nil {
265+ return nil
266+ }
267+ dst := make ([]dns.RR , len (src ))
268+ for i , rr := range src {
269+ dst [i ] = rr .Clone ()
270+ }
271+ return dst
272+ }
273+
274+ // Why this exists: miekg/dns/v2 Msg.Copy just does a shallow copy.
275+ // So, we have to reimplement a clone() function for dns messages.
276+ func cloneMsg (src * dns.Msg ) * dns.Msg {
277+ return & dns.Msg {
278+ MsgHeader : src .MsgHeader ,
279+ Question : cloneRRs (src .Question ),
280+ Answer : cloneRRs (src .Answer ),
281+ Ns : cloneRRs (src .Ns ),
282+ Extra : cloneRRs (src .Extra ),
283+ Pseudo : cloneRRs (src .Pseudo ),
284+ }
285+ }
286+
263287func hasEDNS0Padding (packet []byte ) (bool , error ) {
264288 msg := dns.Msg {Data : packet }
265289 if err := msg .Unpack (); err != nil {
@@ -380,7 +404,7 @@ func DNSExchange(
380404
381405 for tries := range maxTries {
382406 if tryFragmentsSupport {
383- queryCopy := query . Copy ( )
407+ queryCopy := cloneMsg ( query )
384408 queryCopy .ID += uint16 (options )
385409 go func (query * dns.Msg , delay time.Duration ) {
386410 time .Sleep (delay )
@@ -396,7 +420,7 @@ func DNSExchange(
396420 }(queryCopy , time .Duration (200 * tries )* time .Millisecond )
397421 options ++
398422 }
399- queryCopy := query . Copy ( )
423+ queryCopy := cloneMsg ( query )
400424 queryCopy .ID += uint16 (options )
401425 go func (query * dns.Msg , delay time.Duration ) {
402426 time .Sleep (delay )
0 commit comments