From 9cd656b3777df28579cee8dc85879246de2d9afa Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Tue, 22 Jan 2013 13:27:48 +0100 Subject: [PATCH 1/2] typo --- edns.go | 2 +- ex/reflect/reflect.go | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/edns.go b/edns.go index 7c3b722b..a274a38a 100644 --- a/edns.go +++ b/edns.go @@ -14,7 +14,7 @@ // Basic use pattern for a server to check if (and which) options are set: // // // o is a dns.OPT -// for _, s := range o.Options { +// for _, s := range o.Option { // switch e := s.(type) { // case *dns.EDNS0_NSID: // // do stuff with e.Nsid diff --git a/ex/reflect/reflect.go b/ex/reflect/reflect.go index ef47c6cb..e9b824a4 100644 --- a/ex/reflect/reflect.go +++ b/ex/reflect/reflect.go @@ -72,6 +72,15 @@ func handleReflect(w dns.ResponseWriter, r *dns.Msg) { v4 = a.To4() != nil } + if o := r.IsEdns0(); o != nil { + for _, s := range o.Options { + switch e = s.(type) { + case *dns.EDNS0_SUBNET: + println("SUBNET") + } + } + } + if v4 { rr = new(dns.A) rr.(*dns.A).Hdr = dns.RR_Header{Name: dom, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0} From 951af98c7ef7d80c30a19447fbce2a49c7f285f8 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Tue, 22 Jan 2013 16:41:41 +0100 Subject: [PATCH 2/2] fix multiple edns0 option code --- msg.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/msg.go b/msg.go index 8eb5ab7a..294164ed 100644 --- a/msg.go +++ b/msg.go @@ -712,6 +712,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, err er fv.Set(reflect.ValueOf(txt)) case `dns:"opt"`: // edns0 rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint()) + endrr := off + rdlength if rdlength == 0 { // This is an EDNS0 (OPT Record) with no rdata // We can safely return here. @@ -744,8 +745,11 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, err er e.unpack(msg[off1 : off1+int(optlen)]) edns = append(edns, e) off = off1 + int(optlen) + default: + // do nothing? + off = off1 + int(optlen) } - if off < rdlength { + if off < endrr { goto Option } fv.Set(reflect.ValueOf(edns))