diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2016-10-06 19:52:08 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-06 19:52:08 +0800 |
commit | 07caa3fccdfe11bbee084c043ac11e7cfae9a6b7 (patch) | |
tree | cab1339f5abdbb47abaa26fd76f61f924d0a3fe5 /eth/handler.go | |
parent | 83fc6fdb34f03f0208514cef9bc9b576c5abcfe9 (diff) | |
parent | e482b5694faece927a29289f88d7a87b1ce1fbd1 (diff) | |
download | dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar.gz dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar.bz2 dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar.lz dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar.xz dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.tar.zst dexon-07caa3fccdfe11bbee084c043ac11e7cfae9a6b7.zip |
Merge pull request #3090 from karalabe/fix-eth-header-indexing
eth: monitor malicious header retrieval requests
Diffstat (limited to 'eth/handler.go')
-rw-r--r-- | eth/handler.go | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/eth/handler.go b/eth/handler.go index e6c547c02..d72185dd3 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -17,6 +17,7 @@ package eth import ( + "encoding/json" "errors" "fmt" "math" @@ -371,14 +372,24 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } case query.Origin.Hash != (common.Hash{}) && !query.Reverse: // 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 { unknown = true } - } else { - unknown = true } case query.Reverse: // Number based traversal towards the genesis block |