Fix the NBT decoder panic if length less than 0
This commit is contained in:
@ -60,7 +60,7 @@ func TestUnmarshal_simple(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshal_bittest(t *testing.T) {
|
func TestUnmarshal_bitTest(t *testing.T) {
|
||||||
// Generated by vscode-hexdump
|
// Generated by vscode-hexdump
|
||||||
data := []byte{
|
data := []byte{
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
@ -306,3 +306,20 @@ func TestUnmarshal_ByteArray(t *testing.T) {
|
|||||||
}
|
}
|
||||||
// t.Log(infValue)
|
// t.Log(infValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshal_ErrorString(t *testing.T) {
|
||||||
|
var data = []byte{
|
||||||
|
0x08, 0x00, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0xFF, 0xFE,
|
||||||
|
0x42, 0x61, 0x6e, 0x61, 0x6e, 0x72, 0x61, 0x6d, 0x61,
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unmarshal to string
|
||||||
|
var Name string
|
||||||
|
err := Unmarshal(data, &Name)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("should return a error if len < 0")
|
||||||
|
}
|
||||||
|
t.Log(err)
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -221,6 +221,9 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte, tagName string) err
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if listLen < 0 {
|
||||||
|
return errors.New("list length less than 0")
|
||||||
|
}
|
||||||
|
|
||||||
// If we need parse TAG_List into slice, make a new with right length.
|
// If we need parse TAG_List into slice, make a new with right length.
|
||||||
// Otherwise if we need parse into array, we check if len(array) are enough.
|
// Otherwise if we need parse into array, we check if len(array) are enough.
|
||||||
@ -394,6 +397,10 @@ func (d *Decoder) readTag() (tagType byte, tagName string, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) readNByte(n int) (buf []byte, err error) {
|
func (d *Decoder) readNByte(n int) (buf []byte, err error) {
|
||||||
|
if n < 0 {
|
||||||
|
return nil, errors.New("read n byte cannot less than 0")
|
||||||
|
}
|
||||||
|
|
||||||
buf = make([]byte, n)
|
buf = make([]byte, n)
|
||||||
_, err = d.r.Read(buf) //what happened if (returned n) != (argument n) ?
|
_, err = d.r.Read(buf) //what happened if (returned n) != (argument n) ?
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user