Fix positive replies

This commit is contained in:
Miek Gieben 2016-03-29 13:22:17 +00:00
parent 547a4ab2a8
commit 4be4d92ccb
3 changed files with 10 additions and 8 deletions

View file

@ -51,6 +51,7 @@ var dnssecTestCases = []coretest.Case{
}, },
}, },
{ {
// NoData
Qname: "a.miek.nl.", Qtype: dns.TypeSRV, Do: true, Qname: "a.miek.nl.", Qtype: dns.TypeSRV, Do: true,
Ns: []dns.RR{ Ns: []dns.RR{
coretest.NSEC("a.miek.nl. 14400 IN NSEC archive.miek.nl. A AAAA RRSIG NSEC"), coretest.NSEC("a.miek.nl. 14400 IN NSEC archive.miek.nl. A AAAA RRSIG NSEC"),
@ -60,6 +61,7 @@ var dnssecTestCases = []coretest.Case{
}, },
}, },
/* HAHA nsec... shit. /* HAHA nsec... shit.
// disprove *.miek.nl and that b.miek.nl does not exist
{ {
Qname: "b.miek.nl.", Qtype: dns.TypeA, Qname: "b.miek.nl.", Qtype: dns.TypeA,
Rcode: dns.RcodeNameError, Rcode: dns.RcodeNameError,

View file

@ -39,7 +39,7 @@ func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
return xfr.ServeDNS(ctx, w, r) return xfr.ServeDNS(ctx, w, r)
} }
an, ns, extra, result := z.Lookup(qname, state.QType(), state.Do()) answer, ns, extra, result := z.Lookup(qname, state.QType(), state.Do())
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
@ -47,10 +47,9 @@ func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
switch result { switch result {
case Success: case Success:
// case? m.Answer = answer
m.Answer = an m.Ns = ns
m.Extra = extra m.Extra = extra
// Ns section
case NameError: case NameError:
m.Ns = ns m.Ns = ns
m.Rcode = dns.RcodeNameError m.Rcode = dns.RcodeNameError

View file

@ -25,13 +25,14 @@ func (z *Zone) Lookup(qname string, qtype uint16, do bool) ([]dns.RR, []dns.RR,
} else { } else {
rr = mk() rr = mk()
} }
rr.Header().Rrtype = qtype // this is pretty nonobvious
if qtype == dns.TypeSOA { if qtype == dns.TypeSOA {
return z.lookupSOA(do) return z.lookupSOA(do)
} }
// Misuse rr to be a question.
rr.Header().Rrtype = qtype
rr.Header().Name = qname rr.Header().Name = qname
elem := z.Tree.Get(rr) elem := z.Tree.Get(rr)
if elem == nil { if elem == nil {
return z.nameError(elem, rr, do) return z.nameError(elem, rr, do)
@ -47,6 +48,7 @@ func (z *Zone) Lookup(qname string, qtype uint16, do bool) ([]dns.RR, []dns.RR,
if len(rrs) == 0 { if len(rrs) == 0 {
return z.noData(elem, do) return z.noData(elem, do)
} }
if do { if do {
sigs := elem.Types(dns.TypeRRSIG) sigs := elem.Types(dns.TypeRRSIG)
sigs = signatureForSubType(sigs, qtype) sigs = signatureForSubType(sigs, qtype)
@ -69,7 +71,7 @@ func (z *Zone) nameError(elem *tree.Elem, rr dns.RR, do bool) ([]dns.RR, []dns.R
return nil, ret, nil, Success return nil, ret, nil, Success
} }
// NSECs! // NSECs!
return nil, []dns.RR{z.SOA}, nil, Success return nil, []dns.RR{z.SOA}, nil, NameError
} }
func (z *Zone) lookupSOA(do bool) ([]dns.RR, []dns.RR, []dns.RR, Result) { func (z *Zone) lookupSOA(do bool) ([]dns.RR, []dns.RR, []dns.RR, Result) {
@ -94,7 +96,6 @@ func (z *Zone) lookupNSEC(elem *tree.Elem, do bool) []dns.RR {
} }
} }
return nsec return nsec
} }
func (z *Zone) lookupCNAME(rrs []dns.RR, rr dns.RR, do bool) ([]dns.RR, []dns.RR, []dns.RR, Result) { func (z *Zone) lookupCNAME(rrs []dns.RR, rr dns.RR, do bool) ([]dns.RR, []dns.RR, []dns.RR, Result) {