mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-23 03:38:35 +00:00
core: check the length of NotValidBefore attr while decoding
DecodeBinary throws panic otherwise.
This commit is contained in:
parent
8548786444
commit
31aa66a4a4
2 changed files with 27 additions and 7 deletions
|
@ -31,13 +31,25 @@ func TestAttribute_EncodeBinary(t *testing.T) {
|
||||||
testserdes.EncodeDecodeBinary(t, attr, new(Attribute))
|
testserdes.EncodeDecodeBinary(t, attr, new(Attribute))
|
||||||
})
|
})
|
||||||
t.Run("NotValidBefore", func(t *testing.T) {
|
t.Run("NotValidBefore", func(t *testing.T) {
|
||||||
attr := &Attribute{
|
t.Run("positive", func(t *testing.T) {
|
||||||
Type: NotValidBeforeT,
|
attr := &Attribute{
|
||||||
Value: &NotValidBefore{
|
Type: NotValidBeforeT,
|
||||||
Height: 123,
|
Value: &NotValidBefore{
|
||||||
},
|
Height: 123,
|
||||||
}
|
},
|
||||||
testserdes.EncodeDecodeBinary(t, attr, new(Attribute))
|
}
|
||||||
|
testserdes.EncodeDecodeBinary(t, attr, new(Attribute))
|
||||||
|
})
|
||||||
|
t.Run("bad format: too long", func(t *testing.T) {
|
||||||
|
bw := io.NewBufBinWriter()
|
||||||
|
bw.WriteVarBytes([]byte{1, 2, 3, 4, 5})
|
||||||
|
require.Error(t, testserdes.DecodeBinary(bw.Bytes(), new(NotValidBefore)))
|
||||||
|
})
|
||||||
|
t.Run("bad format: too short", func(t *testing.T) {
|
||||||
|
bw := io.NewBufBinWriter()
|
||||||
|
bw.WriteVarBytes([]byte{1, 2, 3})
|
||||||
|
require.Error(t, testserdes.DecodeBinary(bw.Bytes(), new(NotValidBefore)))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
t.Run("Reserved", func(t *testing.T) {
|
t.Run("Reserved", func(t *testing.T) {
|
||||||
getReservedAttribute := func(t AttrType) *Attribute {
|
getReservedAttribute := func(t AttrType) *Attribute {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package transaction
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
)
|
)
|
||||||
|
@ -14,6 +15,13 @@ type NotValidBefore struct {
|
||||||
// DecodeBinary implements io.Serializable interface.
|
// DecodeBinary implements io.Serializable interface.
|
||||||
func (n *NotValidBefore) DecodeBinary(br *io.BinReader) {
|
func (n *NotValidBefore) DecodeBinary(br *io.BinReader) {
|
||||||
bytes := br.ReadVarBytes(4)
|
bytes := br.ReadVarBytes(4)
|
||||||
|
if br.Err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(bytes) != 4 {
|
||||||
|
br.Err = fmt.Errorf("expected 4 bytes, got %d", len(bytes))
|
||||||
|
return
|
||||||
|
}
|
||||||
n.Height = binary.LittleEndian.Uint32(bytes)
|
n.Height = binary.LittleEndian.Uint32(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue