diff --git a/core/java/src/net/i2p/data/TunnelId.java b/core/java/src/net/i2p/data/TunnelId.java index 6c060934864a4fef662993d34c71a415c05dd98b..0d5de2e7320e661e1b6bf3684de1fbaad10ff3f2 100644 --- a/core/java/src/net/i2p/data/TunnelId.java +++ b/core/java/src/net/i2p/data/TunnelId.java @@ -27,7 +27,7 @@ import java.io.OutputStream; public class TunnelId extends DataStructureImpl { private long _tunnelId; - public static final long MAX_ID_VALUE = (1L << 32) - 2L; + public static final long MAX_ID_VALUE = 0xffffffffL; public TunnelId() { _tunnelId = -1; diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java index 4e80c3657231e7be7e1aa13dd14e06f4355650cf..fbd2bcd0629bbe67fd784a4220863d45185ae10c 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java @@ -396,7 +396,7 @@ public class TunnelDispatcher implements Service { long rv; TunnelId tid; do { - rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1); + rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE); tid = new TunnelId(rv); } while (_outboundGateways.containsKey(tid)); return rv; @@ -413,7 +413,7 @@ public class TunnelDispatcher implements Service { long rv; TunnelId tid; do { - rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1); + rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE); tid = new TunnelId(rv); } while (_participants.containsKey(tid)); return rv; @@ -430,7 +430,7 @@ public class TunnelDispatcher implements Service { long rv; TunnelId tid; do { - rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1); + rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE); tid = new TunnelId(rv); } while (_inboundGateways.containsKey(tid)); return rv; diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index b70600586fcb631d16e65a87399591f9076dde6a..cd38b64af1aea754f9002d79510bfe14644ada2c 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -668,6 +668,16 @@ class BuildHandler implements Runnable { return; } + if (ourId <= 0 || ourId > TunnelId.MAX_ID_VALUE || + nextId <= 0 || nextId > TunnelId.MAX_ID_VALUE) { + _context.statManager().addRateData("tunnel.rejectHostile", 1); + if (_log.shouldWarn()) + _log.warn("Dropping build request, bad tunnel ID: " + req); + if (from != null) + _context.commSystem().mayDisconnect(from); + return; + } + // Loop checks if ((!isOutEnd) && _context.routerHash().equals(nextPeer)) { _context.statManager().addRateData("tunnel.rejectHostile", 1); diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java index f9eaad30735f909a125e16e117713482cd037171..0856c5dc215489a7172ff3c39c0604e963edad19 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java @@ -95,7 +95,7 @@ abstract class BuildRequestor { else if (isIB && i == len - 1) id = ctx.tunnelDispatcher().getNewIBEPID(); else - id = 1 + ctx.random().nextLong(TunnelId.MAX_ID_VALUE - 1); + id = 1 + ctx.random().nextLong(TunnelId.MAX_ID_VALUE); cfg.getConfig(i).setReceiveTunnelId(DataHelper.toLong(4, id)); } diff --git a/router/java/test/junit/net/i2p/router/tunnel/FragmentTest.java b/router/java/test/junit/net/i2p/router/tunnel/FragmentTest.java index ac6b961072cae3fde4f4cd725213f7906fa24d91..4722bcecb23d3cd5c4a1dc60e071dc33d732193a 100644 --- a/router/java/test/junit/net/i2p/router/tunnel/FragmentTest.java +++ b/router/java/test/junit/net/i2p/router/tunnel/FragmentTest.java @@ -161,7 +161,7 @@ public class FragmentTest { _context.random().nextBytes(toRouter.getData()); } if (includeTunnel) - toTunnel = new TunnelId(_context.random().nextLong(TunnelId.MAX_ID_VALUE)); + toTunnel = new TunnelId(1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE)); return new PendingGatewayMessage(m, toRouter, toTunnel); }