Skip to content

Commit df3ba8e

Browse files
committed
Add a helper funciton to clone (not copy) a dns message
1 parent f41078a commit df3ba8e

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

dnscrypt-proxy/dnsutils.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
263287
func 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

Comments
 (0)