Skip to content

Commit 9000428

Browse files
antonis19sivaratrisrinivas
authored andcommitted
eth/protocols/eth: improve over/underflow handling in GetBlockHeaders (ethereum#31522)
1 parent c1f29ff commit 9000428

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

eth/protocols/eth/handler_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,34 @@ func testGetBlockHeaders(t *testing.T, protocol uint) {
297297
backend.chain.GetBlockByNumber(0).Hash(),
298298
},
299299
},
300+
// Check a corner case where skipping causes overflow with reverse=false
301+
{
302+
&GetBlockHeadersRequest{Origin: HashOrNumber{Number: 1}, Amount: 2, Reverse: false, Skip: math.MaxUint64 - 1},
303+
[]common.Hash{
304+
backend.chain.GetBlockByNumber(1).Hash(),
305+
},
306+
},
307+
// Check a corner case where skipping causes overflow with reverse=true
308+
{
309+
&GetBlockHeadersRequest{Origin: HashOrNumber{Number: 1}, Amount: 2, Reverse: true, Skip: math.MaxUint64 - 1},
310+
[]common.Hash{
311+
backend.chain.GetBlockByNumber(1).Hash(),
312+
},
313+
},
314+
// Check another corner case where skipping causes overflow with reverse=false
315+
{
316+
&GetBlockHeadersRequest{Origin: HashOrNumber{Number: 1}, Amount: 2, Reverse: false, Skip: math.MaxUint64},
317+
[]common.Hash{
318+
backend.chain.GetBlockByNumber(1).Hash(),
319+
},
320+
},
321+
// Check another corner case where skipping causes overflow with reverse=true
322+
{
323+
&GetBlockHeadersRequest{Origin: HashOrNumber{Number: 1}, Amount: 2, Reverse: true, Skip: math.MaxUint64},
324+
[]common.Hash{
325+
backend.chain.GetBlockByNumber(1).Hash(),
326+
},
327+
},
300328
// Check a corner case where skipping overflow loops back into the chain start
301329
{
302330
&GetBlockHeadersRequest{Origin: HashOrNumber{Hash: backend.chain.GetBlockByNumber(3).Hash()}, Amount: 2, Reverse: false, Skip: math.MaxUint64 - 1},

eth/protocols/eth/handlers.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -128,15 +128,22 @@ func serviceNonContiguousBlockHeaderQuery(chain *core.BlockChain, query *GetBloc
128128
}
129129
case query.Reverse:
130130
// Number based traversal towards the genesis block
131-
if query.Origin.Number >= query.Skip+1 {
132-
query.Origin.Number -= query.Skip + 1
133-
} else {
131+
current := query.Origin.Number
132+
ancestor := current - (query.Skip + 1)
133+
if ancestor >= current { // check for underflow
134134
unknown = true
135+
} else {
136+
query.Origin.Number = ancestor
135137
}
136138

137139
case !query.Reverse:
138-
// Number based traversal towards the leaf block
139-
query.Origin.Number += query.Skip + 1
140+
current := query.Origin.Number
141+
next := current + query.Skip + 1
142+
if next <= current { // check for overflow
143+
unknown = true
144+
} else {
145+
query.Origin.Number = next
146+
}
140147
}
141148
}
142149
return headers

0 commit comments

Comments
 (0)