diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java index 92696ff9cec0986a349712e2d00724830fb916cb..96c4282c8cdebd371049cb034d236681e5d5a77f 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -1363,6 +1363,7 @@ class EstablishmentManager { _transport.markUnreachable(peer); _transport.dropPeer(peer, false, err); //_context.profileManager().commErrorOccurred(peer); + outboundState.fail(); } else { OutNetMessage msg; while ((msg = outboundState.getNextQueuedMessage()) != null) { diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java index ff9485255979a71e885405d82def2e869dc89369..9f519f5ae7ee84cda6a75efdf6e5372ea2c0522e 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java @@ -201,14 +201,16 @@ class OutboundEstablishState { /** caller must synch - only call once */ private void prepareSessionRequest() { _keyBuilder = _keyFactory.getBuilder(); - _sentX = new byte[UDPPacketReader.SessionRequestReader.X_LENGTH]; byte X[] = _keyBuilder.getMyPublicValue().toByteArray(); - if (X.length == 257) + if (X.length == 257) { + _sentX = new byte[256]; System.arraycopy(X, 1, _sentX, 0, _sentX.length); - else if (X.length == 256) - System.arraycopy(X, 0, _sentX, 0, _sentX.length); - else + } else if (X.length == 256) { + _sentX = X; + } else { + _sentX = new byte[256]; System.arraycopy(X, 0, _sentX, _sentX.length - X.length, X.length); + } } public synchronized byte[] getSentX() { @@ -219,7 +221,7 @@ class OutboundEstablishState { return _sentX; } - /** + /**x * The remote side (Bob) - note that in some places he's called Charlie. * Warning - may change after introduction. May be null before introduction. */ @@ -339,6 +341,11 @@ class OutboundEstablishState { _receivedEncryptedSignature = null; _receivedIV = null; _receivedSignature = null; + if (_keyBuilder != null) { + if (_keyBuilder.getPeerPublicValue() == null) + _keyFactory.returnUnused(_keyBuilder); + _keyBuilder = null; + } // sure, there's a chance the packet was corrupted, but in practice // this means that Bob doesn't know his external port, so give up. _currentState = OutboundState.OB_STATE_VALIDATION_FAILED;