From ed31575cee129443910a6f503202541abc0362bc Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Nov 2021 16:31:27 +0100 Subject: [PATCH] Ignore un-parse-able RR records when serializing --- resolver/rrcache.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/resolver/rrcache.go b/resolver/rrcache.go index de62b4e6..f82b416b 100644 --- a/resolver/rrcache.go +++ b/resolver/rrcache.go @@ -135,20 +135,30 @@ func (rrCache *RRCache) ToNameRecord() *NameRecord { Resolver: rrCache.Resolver, } - // stringify RR entries - for _, entry := range rrCache.Answer { - new.Answer = append(new.Answer, entry.String()) - } - for _, entry := range rrCache.Ns { - new.Ns = append(new.Ns, entry.String()) - } - for _, entry := range rrCache.Extra { - new.Extra = append(new.Extra, entry.String()) - } + // Serialize RR entries to strings. + new.Answer = toNameRecordSection(rrCache.Answer) + new.Ns = toNameRecordSection(rrCache.Ns) + new.Extra = toNameRecordSection(rrCache.Extra) return new } +func toNameRecordSection(rrSection []dns.RR) []string { + serialized := make([]string, 0, len(rrSection)) + for _, entry := range rrSection { + // Ignore some RR types. + switch entry.Header().Rrtype { + case dns.TypeOPT: + // This record type cannot be unserialized again and only consists of + // additional metadata. + case dns.TypeNULL: + default: + serialized = append(serialized, entry.String()) + } + } + return serialized +} + // rcodeIsCacheable returns whether a record with the given RCode should be cached. func rcodeIsCacheable(rCode int) bool { switch rCode {