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} 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))