prevent peer flooding request queue for an inv

mapAlreadyAskedFor does not keep track of which peer has a request queued for a
particular tx. As a result, a peer can blind a node to a tx indefinitely by
sending many invs for the same tx, and then never replying to getdatas for it.
Each inv received will be placed 2 minutes farther back in mapAlreadyAskedFor,
so a short message containing 10 invs would render that tx unavailable for 20
minutes.

This is fixed by disallowing a peer from having more than one entry for a
particular inv in mapAlreadyAskedFor at a time.
This commit is contained in:
kazcw
2014-07-16 14:31:41 -07:00
committed by Gregory Maxwell
parent 0b0fc179ab
commit 5029698186
3 changed files with 6 additions and 0 deletions

View File

@@ -5226,6 +5226,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
vGetData.clear();
}
}
pto->setAskFor.erase(inv.hash);
pto->mapAskFor.erase(pto->mapAskFor.begin());
}
if (!vGetData.empty())