From 4d4308c4864cdc28d9132ccee5cd2d548ca5b8f6 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 17 Oct 2014 14:15:40 +0000 Subject: [PATCH] NTCP: Deadlock fix 3rd try (ticket #1394) --- history.txt | 3 +++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- .../i2p/router/transport/ntcp/EstablishState.java | 14 ++++++-------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/history.txt b/history.txt index ebf0add0b..9c7e4e333 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2014-10-17 zzz + * NTCP: Deadlock fix 3rd try (ticket #1394) + 2014-10-16 zzz * NTCP: Deadlock fix 2nd try (ticket #1394) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e36cd3b14..7f4edb975 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -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 = 12; + public final static long BUILD = 13; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java index 97369ed8a..c7684993d 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java @@ -657,7 +657,7 @@ class EstablishState { System.arraycopy(_prevEncrypted, _prevEncrypted.length-AES_SIZE, nextWriteIV, 0, AES_SIZE); // this does not copy the nextWriteIV, do not release to cache _con.finishOutboundEstablishment(_dh.getSessionKey(), (_tsA-_tsB), nextWriteIV, _e_bobSig); // skew in seconds - releaseBufs(); + releaseBufs(true); // if socket gets closed this will be null - prevent NPE InetAddress ia = _con.getChannel().socket().getInetAddress(); if (ia != null) @@ -857,7 +857,7 @@ class EstablishState { System.arraycopy(_e_bobSig, _e_bobSig.length-AES_SIZE, iv, 0, AES_SIZE); // this does not copy the IV, do not release to cache _con.finishInboundEstablishment(_dh.getSessionKey(), (tsA-_tsB), iv, _prevEncrypted); // skew in seconds - releaseBufs(); + releaseBufs(true); if (_log.shouldLog(Log.INFO)) _log.info(prefix()+"Verified remote peer as " + _aliceIdent.calculateHash()); changeState(State.VERIFIED); @@ -961,23 +961,21 @@ class EstablishState { _e = e; if (_log.shouldLog(Log.WARN)) _log.warn(prefix()+"Failed to establish: " + _err, e); - releaseBufs(); + releaseBufs(false); } /** * Only call once. Caller must synch. * @since 0.9.16 */ - private void releaseBufs() { + private void releaseBufs(boolean isVerified) { // null or longer for OB if (_prevEncrypted != null && _prevEncrypted.length == AES_SIZE) SimpleByteCache.release(_prevEncrypted); // Do not release _curEncrypted if verified, it is passed to // NTCPConnection to use as the IV - synchronized(_stateLock) { - if (_state != State.VERIFIED) - SimpleByteCache.release(_curEncrypted); - } + if (!isVerified) + SimpleByteCache.release(_curEncrypted); SimpleByteCache.release(_curDecrypted); SimpleByteCache.release(_hX_xor_bobIdentHash); if (_dh.getPeerPublicValue() == null)