From 3331e1c152ebd94ad529b80d0dd3cd97f9e7404f Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 22 Sep 2014 18:49:20 +0000
Subject: [PATCH] SSU: Return unused DH to the queue

---
 .../transport/udp/EstablishmentManager.java   |  1 +
 .../transport/udp/OutboundEstablishState.java | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

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 92696ff9ce..96c4282c8c 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 ff94852559..9f519f5ae7 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;
-- 
GitLab