From 56b24bf83e566cce893b40d0d02f7d67aeb8eb3f Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 29 May 2020 00:11:54 +0300 Subject: [PATCH 1/2] capability: prevent panic on wrong capabilities receival panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xad7b95] goroutine 134 [running]: github.com/nspcc-dev/neo-go/pkg/network/capability.(*Capability).DecodeBinary(0xc00024a300, 0xc00015c900) /home/rik/dev/neo-go/pkg/network/capability/capability.go:69 +0x85 github.com/nspcc-dev/neo-go/pkg/io.(*BinReader).ReadArray(0xc00015c900, 0xd54880, 0xc00018ecd8, 0xc00071fbe0, 0x1, 0x1) /home/rik/dev/neo-go/pkg/io/binaryReader.go:141 +0x22f github.com/nspcc-dev/neo-go/pkg/network/capability.(*Capabilities).DecodeBinary(0xc00018ecd8, 0xc00015c900) /home/rik/dev/neo-go/pkg/network/capability/capability.go:17 +0x6d github.com/nspcc-dev/neo-go/pkg/network/payload.(*AddressAndTime).DecodeBinary(0xc00018ecc0, 0xc00015c900) /home/rik/dev/neo-go/pkg/network/payload/address.go:34 +0x59 github.com/nspcc-dev/neo-go/pkg/io.(*BinReader).ReadArray(0xc00015c900, 0xcb9e00, 0xc00024a2a0, 0x0, 0x0, 0x0) /home/rik/dev/neo-go/pkg/io/binaryReader.go:141 +0x22f github.com/nspcc-dev/neo-go/pkg/network/payload.(*AddressList).DecodeBinary(0xc00024a2a0, 0xc00015c900) /home/rik/dev/neo-go/pkg/network/payload/address.go:78 +0x54 github.com/nspcc-dev/neo-go/pkg/network.(*Message).decodePayload(0xc000277890, 0xc000292020, 0xc0003da000) /home/rik/dev/neo-go/pkg/network/message.go:158 +0x31a github.com/nspcc-dev/neo-go/pkg/network.(*Message).Decode(0xc000277890, 0xc00071ff48, 0xc00036e090, 0xc000276e40) /home/rik/dev/neo-go/pkg/network/message.go:114 +0x19b github.com/nspcc-dev/neo-go/pkg/network.(*TCPPeer).handleConn(0xc00036e090) /home/rik/dev/neo-go/pkg/network/tcp_peer.go:154 +0x244 created by github.com/nspcc-dev/neo-go/pkg/network.(*TCPTransport).Dial /home/rik/dev/neo-go/pkg/network/tcp_transport.go:40 +0x1ad --- pkg/network/capability/capability.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/network/capability/capability.go b/pkg/network/capability/capability.go index ff5380aa7..7b489ef3a 100644 --- a/pkg/network/capability/capability.go +++ b/pkg/network/capability/capability.go @@ -65,6 +65,7 @@ func (c *Capability) DecodeBinary(br *io.BinReader) { c.Data = &Server{} default: br.Err = errors.New("unknown node capability type") + return } c.Data.DecodeBinary(br) } From eec462b00c6d8014154c72074c75d9bf818d513d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 29 May 2020 00:13:37 +0300 Subject: [PATCH 2/2] network: fix Inv types for Neo 3 They actually use the same types as for messages. Fixes 2020-05-29T00:06:17.593+0300 WARN peer disconnected {"addr": "168.62.167.190:20333", "reason": "handling CMDInv message: invalid inventory type", "peerCount": 3} --- pkg/network/message.go | 6 +++--- pkg/network/payload/inventory.go | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/network/message.go b/pkg/network/message.go index b38c4f5eb..6e1f55091 100644 --- a/pkg/network/message.go +++ b/pkg/network/message.go @@ -68,9 +68,9 @@ const ( CMDGetData CommandType = 0x28 CMDGetBlockData CommandType = 0x29 CMDUnknown CommandType = 0x2a - CMDTX CommandType = 0x2b - CMDBlock CommandType = 0x2c - CMDConsensus CommandType = 0x2d + CMDTX = CommandType(payload.TXType) + CMDBlock = CommandType(payload.BlockType) + CMDConsensus = CommandType(payload.ConsensusType) CMDReject CommandType = 0x2f // SPV protocol diff --git a/pkg/network/payload/inventory.go b/pkg/network/payload/inventory.go index d582e0486..00e211df6 100644 --- a/pkg/network/payload/inventory.go +++ b/pkg/network/payload/inventory.go @@ -14,11 +14,11 @@ type InventoryType uint8 // String implements the Stringer interface. func (i InventoryType) String() string { switch i { - case 0x01: + case TXType: return "TX" - case 0x02: + case BlockType: return "block" - case 0xe0: + case ConsensusType: return "consensus" default: return "unknown inventory type" @@ -32,9 +32,9 @@ func (i InventoryType) Valid() bool { // List of valid InventoryTypes. const ( - TXType InventoryType = 0x01 // 1 - BlockType InventoryType = 0x02 // 2 - ConsensusType InventoryType = 0xe0 // 224 + TXType InventoryType = 0x2b + BlockType InventoryType = 0x2c + ConsensusType InventoryType = 0x2d ) // Inventory payload.