mirror of
https://github.com/miekg/dns.git
synced 2025-12-16 17:21:17 +01:00
Fix compression
This commit is contained in:
parent
ba869578fd
commit
6bf1255177
@ -27,7 +27,6 @@ func main() {
|
|||||||
fmt.Printf("%s\n", err.Error())
|
fmt.Printf("%s\n", err.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Rcode != dns.RcodeSuccess {
|
if r.Rcode != dns.RcodeSuccess {
|
||||||
fmt.Printf(" *** invalid answer name %s after MX query for %s\n", os.Args[1], os.Args[1])
|
fmt.Printf(" *** invalid answer name %s after MX query for %s\n", os.Args[1], os.Args[1])
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -38,7 +37,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
println(r.String())
|
println(r.String())
|
||||||
buf, _ := r.Pack()
|
buf, _ := r.Pack()
|
||||||
buf = dns.Compress(buf)
|
|
||||||
r1 := new(dns.Msg)
|
r1 := new(dns.Msg)
|
||||||
ok := r1.Unpack(buf)
|
ok := r1.Unpack(buf)
|
||||||
if ok {
|
if ok {
|
||||||
|
|||||||
21
msg.go
21
msg.go
@ -18,7 +18,6 @@ import (
|
|||||||
"encoding/base32"
|
"encoding/base32"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -190,7 +189,7 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int) (
|
|||||||
// Except for escaped dots (\.), which are normal dots.
|
// Except for escaped dots (\.), which are normal dots.
|
||||||
// There is also a trailing zero.
|
// There is also a trailing zero.
|
||||||
// Check that we have all the space we need.
|
// Check that we have all the space we need.
|
||||||
tot := len(s) + 1 // TODO: this fails for compression...
|
tot := len(s) + 1 // TODO: this too much for compression...
|
||||||
if off+tot > lenmsg {
|
if off+tot > lenmsg {
|
||||||
return lenmsg, false
|
return lenmsg, false
|
||||||
}
|
}
|
||||||
@ -223,15 +222,11 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int) (
|
|||||||
msg[off] = bs[j]
|
msg[off] = bs[j]
|
||||||
off++
|
off++
|
||||||
}
|
}
|
||||||
str, _, ok := UnpackDomainName(msg, offset)
|
|
||||||
if !ok {
|
|
||||||
// hmmm how can this be?
|
|
||||||
}
|
|
||||||
if compression != nil {
|
if compression != nil {
|
||||||
if p, ok := compression[str]; !ok {
|
if p, ok := compression[string(bs[begin:])]; !ok {
|
||||||
// Only offsets small than this can be used.
|
// Only offsets smaller than this can be used.
|
||||||
if offset < maxCompressionOffset {
|
if offset < maxCompressionOffset {
|
||||||
compression[str] = offset
|
compression[string(bs[begin:])] = offset
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// The first hit is the longest matching dname
|
// The first hit is the longest matching dname
|
||||||
@ -251,11 +246,11 @@ func PackDomainName(s string, msg []byte, off int, compression map[string]int) (
|
|||||||
if string(bs) == "." {
|
if string(bs) == "." {
|
||||||
return off, true
|
return off, true
|
||||||
}
|
}
|
||||||
// If we did compression and we did find something, fix that here
|
// If we did compression and we find something at the pointer here
|
||||||
if pointer != -1 {
|
if pointer != -1 {
|
||||||
// We have two bytes to put the pointer in
|
// We have two bytes (14 bits) to put the pointer in
|
||||||
msg[nameoffset], msg[nameoffset+1] = packUint16(uint16(pointer ^ 0xC000))
|
msg[nameoffset], msg[nameoffset+1] = packUint16(uint16(pointer ^ 0xC000))
|
||||||
off = nameoffset + 1
|
off = nameoffset + 2
|
||||||
return off, true
|
return off, true
|
||||||
}
|
}
|
||||||
msg[off] = 0
|
msg[off] = 0
|
||||||
@ -730,6 +725,7 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo
|
|||||||
}
|
}
|
||||||
s = unpackBase64(msg[off : off+rdlength-consumed])
|
s = unpackBase64(msg[off : off+rdlength-consumed])
|
||||||
off += rdlength - consumed
|
off += rdlength - consumed
|
||||||
|
case "cdomain-name": fallthrough
|
||||||
case "domain-name":
|
case "domain-name":
|
||||||
s, off, ok = UnpackDomainName(msg, off)
|
s, off, ok = UnpackDomainName(msg, off)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -1050,7 +1046,6 @@ func (dns *Msg) Pack() (msg []byte, ok bool) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
fmt.Printf("**%v\n", compression)
|
|
||||||
return msg[:off], true
|
return msg[:off], true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user