@@ -19,6 +19,7 @@ package les
19
19
20
20
import (
21
21
"encoding/binary"
22
+ "encoding/json"
22
23
"errors"
23
24
"fmt"
24
25
"math/big"
@@ -441,7 +442,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
441
442
442
443
// Advance to the next header of the query
443
444
switch {
444
- case query . Origin . Hash != (common. Hash {}) && query .Reverse :
445
+ case hashMode && query .Reverse :
445
446
// Hash based traversal towards the genesis block
446
447
for i := 0 ; i < int (query .Skip )+ 1 ; i ++ {
447
448
if header := pm .blockchain .GetHeader (query .Origin .Hash , number ); header != nil {
@@ -452,16 +453,26 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
452
453
break
453
454
}
454
455
}
455
- case query . Origin . Hash != (common. Hash {}) && ! query .Reverse :
456
+ case hashMode && ! query .Reverse :
456
457
// Hash based traversal towards the leaf block
457
- if header := pm .blockchain .GetHeaderByNumber (origin .Number .Uint64 () + query .Skip + 1 ); header != nil {
458
- if pm .blockchain .GetBlockHashesFromHash (header .Hash (), query .Skip + 1 )[query .Skip ] == query .Origin .Hash {
459
- query .Origin .Hash = header .Hash ()
458
+ var (
459
+ current = origin .Number .Uint64 ()
460
+ next = current + query .Skip + 1
461
+ )
462
+ if next <= current {
463
+ infos , _ := json .MarshalIndent (p .Peer .Info (), "" , " " )
464
+ p .Log ().Warn ("GetBlockHeaders skip overflow attack" , "current" , current , "skip" , query .Skip , "next" , next , "attacker" , infos )
465
+ unknown = true
466
+ } else {
467
+ if header := pm .blockchain .GetHeaderByNumber (next ); header != nil {
468
+ if pm .blockchain .GetBlockHashesFromHash (header .Hash (), query .Skip + 1 )[query .Skip ] == query .Origin .Hash {
469
+ query .Origin .Hash = header .Hash ()
470
+ } else {
471
+ unknown = true
472
+ }
460
473
} else {
461
474
unknown = true
462
475
}
463
- } else {
464
- unknown = true
465
476
}
466
477
case query .Reverse :
467
478
// Number based traversal towards the genesis block
0 commit comments