From 568b5e303f9a23cf5ea020979f0aa89207eaa960 Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Thu, 3 Feb 2022 10:36:03 -0500
Subject: [PATCH] Tunnels: Avoid buggy routers

SSU: Don't bid on connection to buggy routers
---
 history.txt                                         |  4 ++++
 router/java/src/net/i2p/router/RouterVersion.java   |  2 +-
 .../net/i2p/router/transport/udp/UDPTransport.java  | 13 ++++++++++---
 .../i2p/router/tunnel/pool/TunnelPeerSelector.java  | 13 +++++++++++++
 4 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/history.txt b/history.txt
index 087b652874..31f2b932b7 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,7 @@
+2022-02-03 zzz
+ * SSU: Don't bid on connection to buggy routers
+ * Tunnels: Avoid buggy routers
+
 2022-01-30 zzz
  * Reseed, DoH: Fixes for IPv6-only
 
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 837dbdd0fb..3c8f141dcd 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 = "Git";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 10;
+    public final static long BUILD = 11;
 
     /** for example "-test" */
     public final static String EXTRA = "";
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index b96a172a0c..c6a6c6da3b 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -2039,13 +2039,20 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             }
 
             // c++ bug thru 2.36.0/0.9.49, will disconnect inbound session after 5 seconds
-            if (addr.getCost() == 10) {
+            int cost = addr.getCost();
+            if (cost == 10) {
                 if (VersionComparator.comp(toAddress.getVersion(), "0.9.49") <= 0) {
                     //if (_log.shouldDebug())
                     //    _log.debug("Not bidding to: " + toAddress);
                     markUnreachable(to);
                     return null;
                 }
+            } else if (cost == 9) {
+                // c++ bug in 2.40.0/0.9.52, drops SSU messages
+                if (toAddress.getVersion().equals("0.9.52")) {
+                    markUnreachable(to);
+                    return null;
+                }
             }
 
             // Check for supported sig type
@@ -2106,12 +2113,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             } else if (preferUDP()) {
                 return _cachedBid[SLOW_BID];
             } else if (haveCapacity()) {
-                if (addr.getCost() > DEFAULT_COST)
+                if (cost > DEFAULT_COST)
                     return _cachedBid[SLOWEST_COST_BID];
                 else
                     return _cachedBid[SLOWEST_BID];
             } else {
-                if (addr.getCost() > DEFAULT_COST)
+                if (cost > DEFAULT_COST)
                     return _cachedBid[NEAR_CAPACITY_COST_BID];
                 else
                     return _cachedBid[NEAR_CAPACITY_BID];
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index 969acde503..b311324ae5 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -11,6 +11,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 
+import net.i2p.CoreVersion;
 import net.i2p.crypto.EncType;
 import net.i2p.crypto.SHA256Generator;
 import net.i2p.crypto.SigType;
@@ -19,6 +20,7 @@ import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.SessionKey;
+import net.i2p.data.router.RouterAddress;
 import net.i2p.data.router.RouterIdentity;
 import net.i2p.data.router.RouterInfo;
 import net.i2p.router.LeaseSetKeys;
@@ -498,6 +500,17 @@ public abstract class TunnelPeerSelector extends ConnectChecker {
 
         // minimum version check
         String v = peer.getVersion();
+        if (v.equals("0.9.52")) {
+            // c++ bug in 2.40.0/0.9.52, drops SSU messages
+            for (RouterAddress addr : peer.getAddresses()) {
+                if (addr.getCost() == 9 && addr.getTransportStyle().equals("SSU"))
+                    return true;
+            }
+            return false;
+        }
+        // quick check to skip the comparator
+        if (v.equals(CoreVersion.PUBLISHED_VERSION))
+            return false;
         if (VersionComparator.comp(v, MIN_VERSION) < 0)
             return true;
 
-- 
GitLab