Make PackRR enforce RR data length limit
• Make rawSetRdlength return false if length would overflow • Make PackRR assume rawSetRdlength returning false indicates an overflow
This commit is contained in:
parent
9ee1d1eda1
commit
8772f9064c
16
dns_test.go
16
dns_test.go
|
@ -463,3 +463,19 @@ func TestNoRdataUnpack(t *testing.T) {
|
|||
t.Logf("%s\n", rr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRdataOverflow(t *testing.T) {
|
||||
rr := new(RFC3597)
|
||||
rr.Hdr.Name = "."
|
||||
rr.Hdr.Class = ClassINET
|
||||
rr.Hdr.Rrtype = 65280
|
||||
rr.Rdata = hex.EncodeToString(make([]byte, 0xFFFF))
|
||||
buf := make([]byte, 0xFFFF*2)
|
||||
if _, err := PackRR(rr, buf, 0, nil, false); err != nil {
|
||||
t.Fatalf("Maximum size rrdata pack failed: %v", err)
|
||||
}
|
||||
rr.Rdata += "00"
|
||||
if _, err := PackRR(rr, buf, 0, nil, false); err != ErrRdata {
|
||||
t.Fatalf("Oversize rrdata pack didn't return ErrRdata - instead: %v", err)
|
||||
}
|
||||
}
|
||||
|
|
6
msg.go
6
msg.go
|
@ -1306,8 +1306,10 @@ func PackRR(rr RR, msg []byte, off int, compression map[string]int, compress boo
|
|||
if err != nil {
|
||||
return len(msg), err
|
||||
}
|
||||
rawSetRdlength(msg, off, off1)
|
||||
return off1, nil
|
||||
if rawSetRdlength(msg, off, off1) {
|
||||
return off1, nil
|
||||
}
|
||||
return off, ErrRdata
|
||||
}
|
||||
|
||||
// UnpackRR unpacks msg[off:] into an RR.
|
||||
|
|
|
@ -89,7 +89,11 @@ Loop:
|
|||
return false
|
||||
}
|
||||
//off+1 is the end of the header, 'end' is the end of the rr
|
||||
//so 'end' - 'off+2' is the lenght of the rdata
|
||||
msg[off], msg[off+1] = packUint16(uint16(end - (off + 2)))
|
||||
//so 'end' - 'off+2' is the length of the rdata
|
||||
rdatalen := end - (off + 2)
|
||||
if rdatalen > 0xFFFF {
|
||||
return false
|
||||
}
|
||||
msg[off], msg[off+1] = packUint16(uint16(rdatalen))
|
||||
return true
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue