Skip to content

Commit 34fe34a

Browse files
authored
fix(chainsync): Handle error in chainsync.NewWrappedHeader (#998)
Signed-off-by: Akhil Repala <[email protected]>
1 parent 2c19d33 commit 34fe34a

File tree

4 files changed

+54
-28
lines changed

4 files changed

+54
-28
lines changed

protocol/chainsync/messages.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,19 @@ func NewMsgRollForwardNtN(
184184
byronType uint,
185185
blockCbor []byte,
186186
tip Tip,
187-
) *MsgRollForwardNtN {
187+
) (*MsgRollForwardNtN, error) {
188188
m := &MsgRollForwardNtN{
189189
MessageBase: protocol.MessageBase{
190190
MessageType: MessageTypeRollForward,
191191
},
192192
Tip: tip,
193193
}
194-
wrappedHeader := NewWrappedHeader(era, byronType, blockCbor)
195-
if wrappedHeader != nil {
196-
m.WrappedHeader = *wrappedHeader
194+
wrappedHeader, err := NewWrappedHeader(era, byronType, blockCbor)
195+
if err != nil {
196+
return nil, fmt.Errorf("failed to create wrapped header: %w", err)
197197
}
198-
return m
198+
m.WrappedHeader = *wrappedHeader
199+
return m, nil
199200
}
200201

201202
type MsgRollBackward struct {

protocol/chainsync/messages_test.go

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ func TestMsgAwaitReply(t *testing.T) {
127127
}
128128

129129
func TestMsgRollForwardNodeToNode(t *testing.T) {
130+
createMsg := func(t *testing.T, era uint, filePath string, tip Tip) *MsgRollForwardNtN {
131+
blockData := hexDecode(string(readFile(filePath)))
132+
msg, err := NewMsgRollForwardNtN(era, 0, blockData, tip)
133+
if err != nil {
134+
t.Fatalf("failed to create NewMsgRollForwardNtN: %v", err)
135+
}
136+
return msg
137+
}
138+
130139
tests := []testDefinition{
131140
// Byron EBB (NtN)
132141
{
@@ -135,16 +144,10 @@ func TestMsgRollForwardNodeToNode(t *testing.T) {
135144
"testdata/rollforward_ntn_byron_ebb_testnet_8f8602837f7c6f8b8867dd1cbc1842cf51a27eaed2c70ef48325d00f8efb320f.hex",
136145
),
137146
),
138-
Message: NewMsgRollForwardNtN(
147+
Message: createMsg(
148+
t,
139149
ledger.BlockHeaderTypeByron,
140-
0,
141-
hexDecode(
142-
string(
143-
readFile(
144-
"testdata/byron_ebb_testnet_8f8602837f7c6f8b8867dd1cbc1842cf51a27eaed2c70ef48325d00f8efb320f.hex",
145-
),
146-
),
147-
),
150+
"testdata/byron_ebb_testnet_8f8602837f7c6f8b8867dd1cbc1842cf51a27eaed2c70ef48325d00f8efb320f.hex",
148151
Tip{
149152
Point: common.Point{
150153
Slot: 55740899,
@@ -165,16 +168,10 @@ func TestMsgRollForwardNodeToNode(t *testing.T) {
165168
"testdata/rollforward_ntn_shelley_block_testnet_02b1c561715da9e540411123a6135ee319b02f60b9a11a603d3305556c04329f.hex",
166169
),
167170
),
168-
Message: NewMsgRollForwardNtN(
171+
Message: createMsg(
172+
t,
169173
ledger.BlockHeaderTypeShelley,
170-
0,
171-
hexDecode(
172-
string(
173-
readFile(
174-
"testdata/shelley_block_testnet_02b1c561715da9e540411123a6135ee319b02f60b9a11a603d3305556c04329f.hex",
175-
),
176-
),
177-
),
174+
"testdata/shelley_block_testnet_02b1c561715da9e540411123a6135ee319b02f60b9a11a603d3305556c04329f.hex",
178175
Tip{
179176
Point: common.Point{
180177
Slot: 55770176,
@@ -192,6 +189,26 @@ func TestMsgRollForwardNodeToNode(t *testing.T) {
192189
runTests(tests, t)
193190
}
194191

192+
func TestMsgRollForwardNodeToNode_CorruptedCBOR(t *testing.T) {
193+
badCBOR := []byte{0x01, 0x02, 0x03} // garbage CBOR
194+
195+
_, err := NewMsgRollForwardNtN(
196+
ledger.BlockHeaderTypeShelley,
197+
0,
198+
badCBOR,
199+
Tip{
200+
Point: common.Point{
201+
Slot: 1,
202+
Hash: []byte{0xDE, 0xAD, 0xBE, 0xEF},
203+
},
204+
BlockNumber: 1,
205+
},
206+
)
207+
208+
if err == nil {
209+
t.Fatalf("expected error from NewMsgRollForwardNtN with corrupted CBOR, got nil")
210+
}
211+
}
195212
func TestMsgRollForwardNodeToClient(t *testing.T) {
196213
tests := []testDefinition{
197214
// Byron EBB (NtC)

protocol/chainsync/server.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,15 @@ func (s *Server) RollForward(blockType uint, blockData []byte, tip Tip) error {
126126
)
127127
if s.Mode() == protocol.ProtocolModeNodeToNode {
128128
eraId := ledger.BlockToBlockHeaderTypeMap[blockType]
129-
msg := NewMsgRollForwardNtN(
129+
msg, err := NewMsgRollForwardNtN(
130130
eraId,
131131
0,
132132
blockData,
133133
tip,
134134
)
135+
if err != nil {
136+
return fmt.Errorf("failed to create roll forward message: %w", err)
137+
}
135138
return s.SendMessage(msg)
136139
} else {
137140
msg := NewMsgRollForwardNtC(

protocol/chainsync/wrappers.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
package chainsync
1616

1717
import (
18+
"errors"
19+
"fmt"
20+
1821
"github.com/blinklabs-io/gouroboros/cbor"
1922
"github.com/blinklabs-io/gouroboros/ledger"
2023
)
@@ -51,7 +54,7 @@ func NewWrappedHeader(
5154
era uint,
5255
byronType uint,
5356
blockCbor []byte,
54-
) *WrappedHeader {
57+
) (*WrappedHeader, error) {
5558
w := &WrappedHeader{
5659
Era: era,
5760
byronType: byronType,
@@ -64,12 +67,14 @@ func NewWrappedHeader(
6467
}
6568
// Parse block and extract header
6669
tmp := []cbor.RawMessage{}
67-
// TODO: figure out a better way to handle an error (#856)
6870
if _, err := cbor.Decode(blockCbor, &tmp); err != nil {
69-
return nil
71+
return nil, fmt.Errorf("CBOR decode failed in NewWrappedHeader: %w", err)
72+
}
73+
if len(tmp) == 0 {
74+
return nil, errors.New("decoded CBOR header is empty")
7075
}
7176
w.headerCbor = tmp[0]
72-
return w
77+
return w, nil
7378
}
7479

7580
func (w *WrappedHeader) UnmarshalCBOR(data []byte) error {

0 commit comments

Comments
 (0)