@@ -19,6 +19,7 @@ package les
1919
2020import (
2121 "encoding/binary"
22+ "encoding/json"
2223 "errors"
2324 "fmt"
2425 "math/big"
@@ -447,7 +448,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
447448
448449 // Advance to the next header of the query
449450 switch {
450- case query . Origin . Hash != (common. Hash {}) && query .Reverse :
451+ case hashMode && query .Reverse :
451452 // Hash based traversal towards the genesis block
452453 for i := 0 ; i < int (query .Skip )+ 1 ; i ++ {
453454 if header := pm .blockchain .GetHeader (query .Origin .Hash , number ); header != nil {
@@ -458,16 +459,26 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
458459 break
459460 }
460461 }
461- case query . Origin . Hash != (common. Hash {}) && ! query .Reverse :
462+ case hashMode && ! query .Reverse :
462463 // Hash based traversal towards the leaf block
463- if header := pm .blockchain .GetHeaderByNumber (origin .Number .Uint64 () + query .Skip + 1 ); header != nil {
464- if pm .blockchain .GetBlockHashesFromHash (header .Hash (), query .Skip + 1 )[query .Skip ] == query .Origin .Hash {
465- query .Origin .Hash = header .Hash ()
464+ var (
465+ current = origin .Number .Uint64 ()
466+ next = current + query .Skip + 1
467+ )
468+ if next <= current {
469+ infos , _ := json .MarshalIndent (p .Peer .Info (), "" , " " )
470+ p .Log ().Warn ("GetBlockHeaders skip overflow attack" , "current" , current , "skip" , query .Skip , "next" , next , "attacker" , infos )
471+ unknown = true
472+ } else {
473+ if header := pm .blockchain .GetHeaderByNumber (next ); header != nil {
474+ if pm .blockchain .GetBlockHashesFromHash (header .Hash (), query .Skip + 1 )[query .Skip ] == query .Origin .Hash {
475+ query .Origin .Hash = header .Hash ()
476+ } else {
477+ unknown = true
478+ }
466479 } else {
467480 unknown = true
468481 }
469- } else {
470- unknown = true
471482 }
472483 case query .Reverse :
473484 // Number based traversal towards the genesis block
0 commit comments