diff --git a/msg.go b/msg.go index b9f9baff..bb149891 100644 --- a/msg.go +++ b/msg.go @@ -218,6 +218,7 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int, c if ls == 0 || s[ls-1] != '.' { return lenmsg, ErrFqdn } + // TODO(miek) do I really need to string conversions in here??? // Each dot ends a segment of the name. // We trade each dot byte for a length byte. @@ -237,10 +238,10 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int, c bs[j] = bs[j+1] } ls-- - // check for \DDD if off+1 > lenmsg { return lenmsg, ErrBuf } + // check for \DDD if i+2 < ls && bs[i] >= '0' && bs[i] <= '9' && bs[i+1] >= '0' && bs[i+1] <= '9' && bs[i+2] >= '0' && bs[i+2] <= '9' { @@ -250,6 +251,7 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int, c bs[j] = bs[j+2] } ls -= 2 + //fmt.Printf("%10s %v\n", s, msg[:]) } continue } diff --git a/parse_test.go b/parse_test.go index 29251893..bd61608a 100644 --- a/parse_test.go +++ b/parse_test.go @@ -807,3 +807,30 @@ func TestPtrPack(t *testing.T) { t.Error("Failed to parse ", err.Error()) } } + +func TestDigit(t *testing.T) { + tests := map[string]byte{ + "miek\\000.nl. 100 IN A 127.0.0.1": 0, + "miek\\001.nl. 100 IN A 127.0.0.1": 1, + "miek\\004.nl. 100 IN A 127.0.0.1": 4, + "miek\\254.nl. 100 IN A 127.0.0.1": 254, + "miek\\255.nl. 100 IN A 127.0.0.1": 255, + "miek\\256.nl. 100 IN A 127.0.0.1": 0, + "miek\\257.nl. 100 IN A 127.0.0.1": 1, + "miek4.nl. 100 IN A 127.0.0.1": 52, + } + for s, i := range tests { + r, e := NewRR(s) + buf := make([]byte, 40) + if e != nil { + t.Fatalf("Failed to parse %s\n", e.Error()) + } + PackRR(r, buf, 0, nil, false) + t.Logf("%v\n", buf) + if buf[5] != i { + t.Fatalf("5 pos must be %d, is %d", i, buf[5]) + } + r1, _, _ := UnpackRR(buf, 0) + t.Logf("%s\n\n", r1) + } +}