@@ -19,6 +19,7 @@ package les
1919
2020import (
2121 "encoding/binary"
22+ "encoding/json"
2223 "errors"
2324 "fmt"
2425 "math/big"
@@ -441,7 +442,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
441442
442443 // Advance to the next header of the query
443444 switch {
444- case query . Origin . Hash != (common. Hash {}) && query .Reverse :
445+ case hashMode && query .Reverse :
445446 // Hash based traversal towards the genesis block
446447 for i := 0 ; i < int (query .Skip )+ 1 ; i ++ {
447448 if header := pm .blockchain .GetHeader (query .Origin .Hash , number ); header != nil {
@@ -452,16 +453,26 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
452453 break
453454 }
454455 }
455- case query . Origin . Hash != (common. Hash {}) && ! query .Reverse :
456+ case hashMode && ! query .Reverse :
456457 // 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+ }
460473 } else {
461474 unknown = true
462475 }
463- } else {
464- unknown = true
465476 }
466477 case query .Reverse :
467478 // Number based traversal towards the genesis block
0 commit comments