From 19e3122f48676381d7747d6bfad3531b59362740 Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Sun, 15 Jan 2023 11:18:00 -0500
Subject: [PATCH] i2ptunnel: Return error code from SOCKS client on failure to
 build tunnels

previously just closed the socket
---
 .../i2p/i2ptunnel/socks/I2PSOCKSTunnel.java   |  2 ++
 .../net/i2p/i2ptunnel/socks/SOCKS5Server.java | 19 ++++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

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 199d759164..a9f3b2179f 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java
@@ -164,6 +164,8 @@ public class I2PSOCKSTunnel extends I2PTunnelClientBase {
     /** 
      * Because getDefaultOptions() in super() is protected
      * @since 0.8.2
+     *
+     * This will throw IAE on tunnel build failure
      */
     public I2PSocketOptions buildOptions(Properties overrides) {
         Properties defaultOpts = getTunnel().getClientOptions();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
index 2cec2c4d49..4836baee4f 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java
@@ -473,7 +473,17 @@ class SOCKS5Server extends SOCKSServer {
                 if (_log.shouldDebug())
                     _log.debug("connecting to " + connHostName + "...");
                 Properties overrides = new Properties();
-                I2PSocketOptions sktOpts = t.buildOptions(overrides);
+                I2PSocketOptions sktOpts;
+                try {
+                    sktOpts = t.buildOptions(overrides);
+                } catch (RuntimeException re) {
+                    // tunnel build failure
+                    _log.error("socks error", re);
+                    try {
+                        sendRequestReply(Reply.GENERAL_SOCKS_SERVER_FAILURE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
+                    } catch (IOException ioe) {}
+                    throw re;
+                }
                 sktOpts.setPort(connPort);
                 destSock = t.createI2PSocket(dest, sktOpts);
             } else if (hostLowerCase.equals("localhost") || connHostName.equals("127.0.0.1") ||
@@ -525,6 +535,13 @@ class SOCKS5Server extends SOCKSServer {
                     String proxy = proxies.get(p);
                     try {
                         destSock = outproxyConnect(t, proxy);
+                    } catch (RuntimeException re) {
+                        // tunnel build failure
+                        _log.error("socks error", re);
+                        try {
+                            sendRequestReply(Reply.GENERAL_SOCKS_SERVER_FAILURE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
+                        } catch (IOException ioe) {}
+                        throw re;
                     } catch (SOCKSException se) {
                         try {
                             sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
-- 
GitLab