forked from I2P_Developers/i2p.i2p
* SSU:
- Fix relay request handling bug from -10 - Fix peer test reply handling bug from -10 - Fix NPE from -6
This commit is contained in:
@@ -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 = "";
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user