- Fix relay request handling bug from -10
   - Fix peer test reply handling bug from -10
   - Fix NPE from -6
This commit is contained in:
zzz
2012-10-08 09:32:04 +00:00
parent b095b7e769
commit e99dd72cb6
6 changed files with 34 additions and 11 deletions

View File

@@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 11;
public final static long BUILD = 12;
/** for example "-test" */
public final static String EXTRA = "";

View File

@@ -327,13 +327,16 @@ class IntroductionManager {
UDPPacketReader.RelayRequestReader rrReader = reader.getRelayRequestReader();
long tag = rrReader.readTag();
int ipSize = rrReader.readIPSize();
byte ip[] = new byte[ipSize];
rrReader.readIP(ip, 0);
int port = rrReader.readPort();
if ((!isValid(ip, port)) || (!isValid(alice.getIP(), alice.getPort()))) {
if (_log.shouldLog(Log.WARN))
// ip/port inside message should be 0:0, as it's unimplemented on send -
// see PacketBuilder.buildRelayRequest()
if (!isValid(alice.getIP(), alice.getPort()) || ipSize != 0 || port != 0) {
if (_log.shouldLog(Log.WARN)) {
byte ip[] = new byte[ipSize];
rrReader.readIP(ip, 0);
_log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port));
}
_context.statManager().addRateData("udp.relayBadIP", 1);
return;
}

View File

@@ -1863,6 +1863,7 @@ class PeerState {
/**
* Transfer the basic activity/state from the old peer to the current peer
*
* @param oldPeer non-null
*/
public void loadFrom(PeerState oldPeer) {
_rto = oldPeer._rto;

View File

@@ -448,8 +448,8 @@ class PeerTestManager {
}
if ((testPort > 0 && (testPort < 1024 || testPort > 65535)) ||
(testIP != null && (Arrays.equals(testIP, _transport.getExternalIP()) ||
(!_transport.isValid(testIP)) ||
(testIP != null &&
((!_transport.isValid(testIP)) ||
_context.blocklist().isBlocklisted(testIP)))) {
// spoof check, and don't respond to privileged ports
if (_log.shouldLog(Log.WARN))
@@ -461,6 +461,7 @@ class PeerTestManager {
// The from IP/port and message's IP/port are now validated.
// EXCEPT that either the message's IP could be empty or the message's port could be 0.
// Both of those cases should be checked in receiveXfromY() as appropriate.
// Also, IP could be us, check is below.
long nonce = testInfo.readNonce();
PeerTestState test = _currentTest;
@@ -472,6 +473,15 @@ class PeerTestManager {
// we are Bob or Charlie
if (testIP != null && Arrays.equals(testIP, _transport.getExternalIP())) {
// spoof check - have to do this after receiveTestReply(), since
// the field should be us there
if (_log.shouldLog(Log.WARN))
_log.warn("Invalid address in PeerTest: " + Addresses.toString(testIP, testPort));
_context.statManager().addRateData("udp.testBadIP", 1);
return;
}
PeerTestState state = _activeTests.get(Long.valueOf(nonce));
if (state == null) {
@@ -600,6 +610,7 @@ class PeerTestManager {
* The PeerTest message came from the peer referenced in the message (or there wasn't
* any info in the message), plus we are not acting as Charlie (so we've got to be Bob).
*
* testInfo IP/port ignored
*/
private void receiveFromAliceAsBob(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce, PeerTestState state) {
// we are Bob, so pick a (potentially) Charlie and send Charlie Alice's info
@@ -692,10 +703,11 @@ class PeerTestManager {
* The PeerTest message came from one of the Charlies picked for an existing test, so send Alice the
* packet verifying participation.
*
* testInfo IP/port ignored
*/
private void receiveFromCharlieAsBob(RemoteHostId from, PeerTestState state) {
state.setReceiveCharlieTime(_context.clock().now());
state.incrementPacketsRelayed();
if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) {
if (_log.shouldLog(Log.WARN))
@@ -716,6 +728,7 @@ class PeerTestManager {
/**
* We are charlie, so send Alice her PeerTest message
*
* testInfo IP/port ignored
*/
private void receiveFromAliceAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce) {
try {
@@ -723,7 +736,7 @@ class PeerTestManager {
SessionKey aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]);
testInfo.readIntroKey(aliceIntroKey.getData(), 0);
UDPPacket packet = _packetBuilder.buildPeerTestToAlice(aliceIP, from.getPort(), aliceIntroKey, _transport.getIntroKey(), nonce);
if (_log.shouldLog(Log.DEBUG))
_log.debug("Receive from alice as charlie, w/ alice @ " + aliceIP + ":" + from.getPort() + " and nonce " + nonce);

View File

@@ -892,8 +892,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
if (_log.shouldLog(Log.WARN))
_log.warn("Peer already connected (PBRH): old=" + oldPeer2 + " new=" + peer);
// transfer over the old state/inbound message fragments/etc
peer.loadFrom(oldPeer);
oldEstablishedOn = oldPeer.getKeyEstablishedTime();
peer.loadFrom(oldPeer2);
oldEstablishedOn = oldPeer2.getKeyEstablishedTime();
oldPeer2.dropOutbound();
_introManager.remove(oldPeer2);
_expireEvent.remove(oldPeer2);