Skip to content

Commit d18d8ec

Browse files
committed
fix: guard possible nil panics
Signed-off-by: Chris Gianelloni <[email protected]>
1 parent 4b8f432 commit d18d8ec

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

cmd/gouroboros/chainsync.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ func testChainSync(f *globalFlags) {
170170
os.Exit(1)
171171
}
172172
}()
173-
oConn, err = ouroboros.New(
173+
o, err := ouroboros.New(
174174
ouroboros.WithConnection(conn),
175175
ouroboros.WithNetworkMagic(uint32(f.networkMagic)),
176176
ouroboros.WithErrorChan(errorChan),
@@ -183,6 +183,11 @@ func testChainSync(f *globalFlags) {
183183
fmt.Printf("ERROR: %s\n", err)
184184
os.Exit(1)
185185
}
186+
if o == nil {
187+
fmt.Println("ERROR: empty connection")
188+
os.Exit(1)
189+
}
190+
oConn = o
186191

187192
var point common.Point
188193
if chainSyncFlags.tip {
@@ -260,6 +265,9 @@ func chainSyncRollForwardHandler(
260265
blockSlot := v.SlotNumber()
261266
blockHash, _ := hex.DecodeString(v.Hash())
262267
var err error
268+
if oConn == nil {
269+
return fmt.Errorf("empty ouroboros connection, aborting!")
270+
}
263271
block, err = oConn.BlockFetch().Client.GetBlock(common.NewPoint(blockSlot, blockHash))
264272
if err != nil {
265273
return err

ledger/verify_block.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ func VerifyBlock(block BlockHexCbor) (error, bool, string, uint64, uint64) {
5252
headerUnmarshalError.Error(),
5353
), false, "", 0, 0
5454
}
55+
if header == nil {
56+
return fmt.Errorf(
57+
"VerifyBlock: header returned empty",
58+
), false, "", 0, 0
59+
}
5560
isKesValid, errKes := VerifyKes(header, slotPerKesPeriod)
5661
if errKes != nil {
5762
return fmt.Errorf(

protocol/handshake/server.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,21 @@ func (s *Server) handleProposeVersions(msg protocol.Message) error {
129129
// Decode protocol parameters for selected version
130130
versionInfo := protocol.GetProtocolVersion(proposedVersion)
131131
versionData := s.config.ProtocolVersionMap[proposedVersion]
132+
if versionData == nil {
133+
msgRefuse := NewMsgRefuse(
134+
[]any{
135+
RefuseReasonDecodeError,
136+
proposedVersion,
137+
fmt.Errorf("handshake failed: refused due to empty version data"),
138+
},
139+
)
140+
if err := s.SendMessage(msgRefuse); err != nil {
141+
return err
142+
}
143+
return fmt.Errorf(
144+
"handshake failed: refused due to empty version data",
145+
)
146+
}
132147
proposedVersionData, err := versionInfo.NewVersionDataFromCborFunc(
133148
msgProposeVersions.VersionMap[proposedVersion],
134149
)
@@ -148,6 +163,22 @@ func (s *Server) handleProposeVersions(msg protocol.Message) error {
148163
err,
149164
)
150165
}
166+
if proposedVersionData == nil {
167+
msgRefuse := NewMsgRefuse(
168+
[]any{
169+
RefuseReasonDecodeError,
170+
proposedVersion,
171+
fmt.Errorf("handshake failed: refused due to empty version map"),
172+
},
173+
)
174+
if err := s.SendMessage(msgRefuse); err != nil {
175+
return err
176+
}
177+
return fmt.Errorf(
178+
"handshake failed: refused due to empty version map",
179+
)
180+
}
181+
151182
// Check network magic
152183
if proposedVersionData.NetworkMagic() != versionData.NetworkMagic() {
153184
errMsg := fmt.Sprintf(

0 commit comments

Comments
 (0)