|
@@ -17,6 +17,7 @@
|
|
|
package eth
|
|
package eth
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "encoding/json"
|
|
|
"errors"
|
|
"errors"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"math"
|
|
"math"
|
|
@@ -371,14 +372,24 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
|
|
|
}
|
|
}
|
|
|
case query.Origin.Hash != (common.Hash{}) && !query.Reverse:
|
|
case query.Origin.Hash != (common.Hash{}) && !query.Reverse:
|
|
|
// Hash based traversal towards the leaf block
|
|
// Hash based traversal towards the leaf block
|
|
|
- if header := pm.blockchain.GetHeaderByNumber(origin.Number.Uint64() + query.Skip + 1); header != nil {
|
|
|
|
|
- if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
|
|
|
|
|
- query.Origin.Hash = header.Hash()
|
|
|
|
|
|
|
+ var (
|
|
|
|
|
+ current = origin.Number.Uint64()
|
|
|
|
|
+ next = current + query.Skip + 1
|
|
|
|
|
+ )
|
|
|
|
|
+ if next <= current {
|
|
|
|
|
+ infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ")
|
|
|
|
|
+ glog.V(logger.Warn).Infof("%v: GetBlockHeaders skip overflow attack (current %v, skip %v, next %v)\nMalicious peer infos: %s", p, current, query.Skip, next, infos)
|
|
|
|
|
+ unknown = true
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if header := pm.blockchain.GetHeaderByNumber(next); header != nil {
|
|
|
|
|
+ if pm.blockchain.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash {
|
|
|
|
|
+ query.Origin.Hash = header.Hash()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ unknown = true
|
|
|
|
|
+ }
|
|
|
} else {
|
|
} else {
|
|
|
unknown = true
|
|
unknown = true
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- unknown = true
|
|
|
|
|
}
|
|
}
|
|
|
case query.Reverse:
|
|
case query.Reverse:
|
|
|
// Number based traversal towards the genesis block
|
|
// Number based traversal towards the genesis block
|