From cd3515923e43f8daee6a9a13ad51a23dd45cbaef Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sat, 17 Feb 2018 16:04:09 +0000 Subject: [PATCH] i2ptunnel: Close sockets in finally{} --- .../net/i2p/i2ptunnel/I2PTunnelClient.java | 13 +- .../i2p/i2ptunnel/I2PTunnelConnectClient.java | 14 +-- .../i2p/i2ptunnel/I2PTunnelHTTPClient.java | 41 +------ .../i2ptunnel/I2PTunnelHTTPClientRunner.java | 20 ++-- .../net/i2p/i2ptunnel/I2PTunnelIRCClient.java | 11 +- .../net/i2p/i2ptunnel/I2PTunnelIRCServer.java | 2 +- .../net/i2p/i2ptunnel/I2PTunnelRunner.java | 112 +++++++++--------- .../i2p/i2ptunnel/irc/I2PTunnelDCCClient.java | 8 +- .../i2ptunnel/socks/I2PSOCKSIRCTunnel.java | 7 +- .../i2p/i2ptunnel/socks/I2PSOCKSTunnel.java | 7 +- 10 files changed, 100 insertions(+), 135 deletions(-) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java index 0dd9b486b5..7af54060cf 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java @@ -130,21 +130,16 @@ public class I2PTunnelClient extends I2PTunnelClientBase { } catch (IOException ex) { if (_log.shouldLog(Log.INFO)) _log.info("Error connecting", ex); - //l.log("Error connecting: " + ex.getMessage()); - closeSocket(s); - if (i2ps != null) { - synchronized (sockLock) { - mySockets.remove(sockLock); - } - } } catch (I2PException ex) { if (_log.shouldLog(Log.INFO)) _log.info("Error connecting", ex); - //l.log("Error connecting: " + ex.getMessage()); + } finally { + // only because we are running it inline closeSocket(s); if (i2ps != null) { + try { i2ps.close(); } catch (IOException ioe) {} synchronized (sockLock) { - mySockets.remove(sockLock); + mySockets.remove(i2ps); } } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java index 39c573cb47..4fbafbc23d 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java @@ -154,6 +154,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R boolean usingInternalOutproxy = false; Outproxy outproxy = null; long requestId = __requestId.incrementAndGet(); + I2PSocket i2ps = null; try { s.setSoTimeout(INITIAL_SO_TIMEOUT); out = s.getOutputStream(); @@ -228,7 +229,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R if (_log.shouldLog(Log.WARN)) _log.warn(getPrefix(requestId) + "Host wants to be outproxied, but we dont have any!"); writeErrorMessage(ERR_NO_OUTPROXY, out); - s.close(); return; } destination = currentProxy; @@ -237,7 +237,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R } } else if (host.toLowerCase(Locale.US).equals("localhost")) { writeErrorMessage(ERR_LOCALHOST, out); - s.close(); return; } else { // full b64 address (hopefully) destination = host; @@ -292,7 +291,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R if (method == null || !"CONNECT".equals(method.toUpperCase(Locale.US))) { writeErrorMessage(ERR_BAD_PROTOCOL, out); - s.close(); return; } @@ -309,7 +307,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R if (destination == null) { writeErrorMessage(ERR_BAD_PROTOCOL, out); - s.close(); return; } @@ -323,7 +320,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R _log.warn(getPrefix(requestId) + "Auth required, sending 407"); } out.write(DataHelper.getASCII(getAuthError(result == AuthResult.AUTH_STALE))); - s.close(); return; } @@ -335,14 +331,13 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R else header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN); writeErrorMessage(header, out, targetRequest, usingWWWProxy, destination); - s.close(); return; } I2PSocketOptions sktOpts = getDefaultOptions(); if (!usingWWWProxy && remotePort > 0) sktOpts.setPort(remotePort); - I2PSocket i2ps = createI2PSocket(clientDest, sktOpts); + i2ps = createI2PSocket(clientDest, sktOpts); byte[] data = null; byte[] response = null; if (usingWWWProxy) @@ -357,16 +352,17 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R } catch (IOException ex) { _log.info(getPrefix(requestId) + "Error trying to connect", ex); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); - closeSocket(s); } catch (I2PException ex) { _log.info("getPrefix(requestId) + Error trying to connect", ex); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); - closeSocket(s); } catch (OutOfMemoryError oom) { IOException ex = new IOException("OOM"); _log.info("getPrefix(requestId) + Error trying to connect", ex); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); + } finally { + // only because we are running it inline closeSocket(s); + try { i2ps.close(); } catch (IOException ioe) {} } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 12c749961e..0b1cd41595 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -398,7 +398,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String currentProxy = null; long requestId = __requestId.incrementAndGet(); boolean shout = false; - + I2PSocket i2ps = null; try { s.setSoTimeout(INITIAL_SO_TIMEOUT); out = s.getOutputStream(); @@ -555,8 +555,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn reader.drain(); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -694,11 +692,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn "</p>").getBytes("UTF-8")); writeFooter(out); reader.drain(); - // XXX: should closeSocket(s) be in a finally block? } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -814,8 +809,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn reader.drain(); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -852,8 +845,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn reader.drain(); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } else if(host.contains(".") || host.startsWith("[")) { @@ -905,8 +896,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn reader.drain(); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -931,8 +920,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn reader.drain(); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } // end host name processing @@ -1111,8 +1098,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeFooter(out); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1136,8 +1121,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeFooter(out); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1155,8 +1138,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn } } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1200,8 +1181,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeErrorMessage(header, out, targetRequest, false, destination); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1257,8 +1236,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeErrorMessage(header, extraMessage, out, targetRequest, usingWWWProxy, destination, jumpServers); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1270,8 +1247,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeErrorMessage(ERR_INTERNAL_SSL, out, targetRequest, false, destination); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } if (_log.shouldLog(Log.WARN)) _log.warn("SSL to i2p destinations denied by configuration: " + targetRequest); @@ -1288,8 +1263,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn writeHelperSaveForm(out, destination, ahelperKey, targetRequest, referer); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1311,8 +1284,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn "\r\n").getBytes("UTF-8")); } catch (IOException ioe) { // ignore - } finally { - closeSocket(s); } return; } @@ -1325,7 +1296,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn I2PSocketOptions sktOpts = getDefaultOptions(opts); if (remotePort > 0) sktOpts.setPort(remotePort); - I2PSocket i2ps = createI2PSocket(clientDest, sktOpts); + i2ps = createI2PSocket(clientDest, sktOpts); OnTimeout onTimeout = new OnTimeout(s, s.getOutputStream(), targetRequest, usingWWWProxy, currentProxy, requestId); Thread t; if (method.toUpperCase(Locale.US).equals("CONNECT")) { @@ -1350,22 +1321,20 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn if(_log.shouldLog(Log.INFO)) { _log.info(getPrefix(requestId) + "Error trying to connect", ex); } - //l.log("Error connecting: " + ex.getMessage()); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); - closeSocket(s); } catch(I2PException ex) { if(_log.shouldLog(Log.INFO)) { _log.info("getPrefix(requestId) + Error trying to connect", ex); } - //l.log("Error connecting: " + ex.getMessage()); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); - closeSocket(s); } catch(OutOfMemoryError oom) { IOException ex = new IOException("OOM"); _log.error("getPrefix(requestId) + Error trying to connect", oom); - //l.log("Error connecting: " + ex.getMessage()); handleClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId); + } finally { + // only because we are running it inline closeSocket(s); + try { i2ps.close(); } catch (IOException ioe) {} } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java index e6ae0ecab5..3d8919e52e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java @@ -49,27 +49,27 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner { @Override protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException { - try { + if (i2pin != null) { try { i2pin.close(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (i2pout != null) { try { i2pout.close(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (in != null) { try { in.close(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (out != null) { try { out.close(); - } catch (IOException ioe) {} + } catch (IOException ioe) {} } try { i2ps.close(); } catch (IOException ioe) {} try { s.close(); } catch (IOException ioe) {} - t1.join(30*1000); + if (t1 != null) + t1.join(30*1000); // t2 = fromI2P now run inline //t2.join(30*1000); } - } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java index 669492b016..5e31425265 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java @@ -155,12 +155,6 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase { String msg = ":" + name + " 499 you :" + ex + "\r\n"; s.getOutputStream().write(DataHelper.getUTF8(msg)); } catch (IOException ioe) {} - closeSocket(s); - if (i2ps != null) { - synchronized (sockLock) { - mySockets.remove(sockLock); - } - } } catch (I2PException ex) { if (_log.shouldLog(Log.WARN)) _log.warn("Error connecting", ex); @@ -172,10 +166,13 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase { String msg = ":" + name + " 499 you :" + ex + "\r\n"; s.getOutputStream().write(DataHelper.getUTF8(msg)); } catch (IOException ioe) {} + } finally { + // only because we are running it inline closeSocket(s); if (i2ps != null) { + try { i2ps.close(); } catch (IOException ioe) {} synchronized (sockLock) { - mySockets.remove(sockLock); + mySockets.remove(i2ps); } } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java index 5da1926095..6d541b583c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java @@ -231,7 +231,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { * case-insensitive manner? * */ - String cloakDest(Destination d) { + private String cloakDest(Destination d) { String hf; String hc; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java index c3059edc7a..fd422adead 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java @@ -235,13 +235,21 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr @Override public void run() { + boolean i2pReset = false; + boolean sockReset = false; + InputStream in = null; + OutputStream out = null; + InputStream i2pin = null; + OutputStream i2pout = null; + StreamForwarder toI2P = null; + StreamForwarder fromI2P = null; try { - InputStream in = getSocketIn(); - OutputStream out = getSocketOut(); // = new BufferedOutputStream(s.getOutputStream(), NETWORK_BUFFER_SIZE); + in = getSocketIn(); + out = getSocketOut(); // = new BufferedOutputStream(s.getOutputStream(), NETWORK_BUFFER_SIZE); // unimplemented in streaming //i2ps.setSocketErrorListener(this); - InputStream i2pin = i2ps.getInputStream(); - OutputStream i2pout = i2ps.getOutputStream(); //new BufferedOutputStream(i2ps.getOutputStream(), MAX_PACKET_SIZE); + i2pin = i2ps.getInputStream(); + i2pout = i2ps.getOutputStream(); //new BufferedOutputStream(i2ps.getOutputStream(), MAX_PACKET_SIZE); if (initialI2PData != null) { // why synchronize this? we could be in here a LONG time for large initial data //synchronized (slock) { @@ -274,8 +282,8 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr + " written to the socket, starting forwarders"); if (!(s instanceof InternalSocket)) in = new BufferedInputStream(in, 2*NETWORK_BUFFER_SIZE); - StreamForwarder toI2P = new StreamForwarder(in, i2pout, true); - StreamForwarder fromI2P = new StreamForwarder(i2pin, out, false); + toI2P = new StreamForwarder(in, i2pout, true); + fromI2P = new StreamForwarder(i2pin, out, false); toI2P.start(); // We are already a thread, so run the second one inline //fromI2P.start(); @@ -288,8 +296,6 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr if (_log.shouldLog(Log.DEBUG)) _log.debug("At least one forwarder completed, closing and joining"); - boolean i2pReset = false; - boolean sockReset = false; // this task is useful for the httpclient if ((onTimeout != null || _onFail != null) && totalReceived <= 0) { if (_log.shouldLog(Log.DEBUG)) @@ -333,31 +339,6 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr } } - if (i2pReset) { - if (_log.shouldWarn()) - _log.warn("Got I2P reset, resetting socket"); - try { - s.setSoLinger(true, 0); - } catch (IOException ioe) {} - try { - s.close(); - } catch (IOException ioe) {} - try { - i2ps.close(); - } catch (IOException ioe) {} - } else if (sockReset) { - if (_log.shouldWarn()) - _log.warn("Got socket reset, resetting I2P socket"); - try { - i2ps.reset(); - } catch (IOException ioe) {} - try { - s.close(); - } catch (IOException ioe) {} - } else { - // now one connection is dead - kill the other as well, after making sure we flush - close(out, in, i2pout, i2pin, s, i2ps, toI2P, fromI2P); - } } catch (InterruptedException ex) { if (_log.shouldLog(Log.ERROR)) _log.error("Interrupted", ex); @@ -385,40 +366,58 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr _log.error("Internal error", e); } finally { removeRef(); - try { - if (s != null) + if (i2pReset) { + if (_log.shouldWarn()) + _log.warn("Got I2P reset, resetting socket"); + try { + s.setSoLinger(true, 0); + } catch (IOException ioe) {} + try { s.close(); - } catch (IOException ex) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Could not close java socket", ex); - } - if (i2ps != null) { - try { + } catch (IOException ioe) {} + try { i2ps.close(); - } catch (IOException ex) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Could not close I2PSocket", ex); - } - // unimplemented in streaming - //i2ps.setSocketErrorListener(null); + } catch (IOException ioe) {} + } else if (sockReset) { + if (_log.shouldWarn()) + _log.warn("Got socket reset, resetting I2P socket"); + try { + i2ps.reset(); + } catch (IOException ioe) {} + try { + s.close(); + } catch (IOException ioe) {} + } else { + // now one connection is dead - kill the other as well, after making sure we flush + try { + close(out, in, i2pout, i2pin, s, i2ps, toI2P, fromI2P); + } catch (InterruptedException ie) {} } } } + /** + * @param out may be null + * @param in may be null + * @param i2pout may be null + * @param i2pin may be null + * @param t1 may be null + * @param t2 may be null + */ protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException { - try { + if (out != null) { try { out.flush(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (i2pout != null) { try { i2pout.flush(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (in != null) { try { in.close(); - } catch (IOException ioe) {} - try { + } catch (IOException ioe) {} } + if (i2pin != null) { try { i2pin.close(); - } catch (IOException ioe) {} + } catch (IOException ioe) {} } // ok, yeah, there's a race here in theory, if data comes in after flushing and before // closing, but its better than before... try { @@ -427,7 +426,8 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr try { i2ps.close(); } catch (IOException ioe) {} - t1.join(30*1000); + if (t1 != null) + t1.join(30*1000); // t2 = fromI2P now run inline //t2.join(30*1000); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java index 24ac12e61b..f18f736e10 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java @@ -83,18 +83,16 @@ public class I2PTunnelDCCClient extends I2PTunnelClientBase { t.run(); } catch (IOException ex) { _log.error("Could not make DCC connection to " + _dest + ':' + _remotePort, ex); - closeSocket(s); - if (i2ps != null) { - try { i2ps.close(); } catch (IOException ioe) {} - } notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort())); } catch (I2PException ex) { _log.error("Could not make DCC connection to " + _dest + ':' + _remotePort, ex); + notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort())); + } finally { + // only because we are running it inline closeSocket(s); if (i2ps != null) { try { i2ps.close(); } catch (IOException ioe) {} } - notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort())); } stop(); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java index 824dbea978..d96e3fb1bf 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java @@ -6,6 +6,7 @@ */ package net.i2p.i2ptunnel.socks; +import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.util.concurrent.atomic.AtomicInteger; @@ -47,6 +48,7 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel { */ @Override protected void clientConnectionRun(Socket s) { + I2PSocket destSock = null; try { //_log.error("SOCKS IRC Tunnel Start"); try { @@ -57,7 +59,7 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel { try { s.setSoTimeout(0); } catch (SocketException ioe) {} - I2PSocket destSock = serv.getDestinationI2PSocket(this); + destSock = serv.getDestinationI2PSocket(this); StringBuffer expectedPong = new StringBuffer(); int id = __clientId.incrementAndGet(); Thread in = new I2PAppThread(new IrcInboundFilter(clientSock, destSock, expectedPong, _log), @@ -72,7 +74,10 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel { } catch (SOCKSException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Error from SOCKS connection", e); + } finally { + // only because we are running it inline closeSocket(s); + if (destSock != null) try { destSock.close(); } catch (IOException ioe) {} } } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java index 71c77c93e9..100891f17b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java @@ -6,6 +6,7 @@ */ package net.i2p.i2ptunnel.socks; +import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; @@ -57,6 +58,7 @@ public class I2PSOCKSTunnel extends I2PTunnelClientBase { } protected void clientConnectionRun(Socket s) { + I2PSocket destSock = null; try { try { s.setSoTimeout(INITIAL_SO_TIMEOUT); @@ -66,7 +68,7 @@ public class I2PSOCKSTunnel extends I2PTunnelClientBase { try { s.setSoTimeout(0); } catch (SocketException ioe) {} - I2PSocket destSock = serv.getDestinationI2PSocket(this); + destSock = serv.getDestinationI2PSocket(this); Thread t = new I2PTunnelRunner(clientSock, destSock, sockLock, null, null, mySockets, (I2PTunnelRunner.FailCallback) null); // we are called from an unlimited thread pool, so run inline @@ -75,7 +77,10 @@ public class I2PSOCKSTunnel extends I2PTunnelClientBase { } catch (SOCKSException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Error from SOCKS connection", e); + } finally { + // only because we are running it inline closeSocket(s); + if (destSock != null) try { destSock.close(); } catch (IOException ioe) {} } } -- GitLab