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:
Andrew Tunnell-Jones 2014-04-29 05:03:01 +00:00
parent 9ee1d1eda1
commit 8772f9064c
3 changed files with 26 additions and 4 deletions

View File

@ -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
View File

@ -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.

View File

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