From f9571740ae985a2c1cc096e08b51ce8fa99f3ca4 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 14 Oct 2013 17:02:08 +0000
Subject: [PATCH] address check cleanup

---
 .../i2p/router/transport/TransportUtil.java   | 22 +++++++++++--------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/TransportUtil.java b/router/java/src/net/i2p/router/transport/TransportUtil.java
index 61df53e947..0332a9105b 100644
--- a/router/java/src/net/i2p/router/transport/TransportUtil.java
+++ b/router/java/src/net/i2p/router/transport/TransportUtil.java
@@ -131,25 +131,29 @@ public abstract class TransportUtil {
                 // IPv4 compat ::xxxx:xxxx
                 if (addr[0] == 0)
                     return false;
-                // disallow 2002::/16 (6to4 RFC 3056)
-                if (addr[0] == 0x20 && addr[1] == 0x02)
-                    return false;
+                if (addr[0] == 0x20) {
+                    // disallow 2002::/16 (6to4 RFC 3056)
+                    if (addr[1] == 0x02)
+                        return false;
+                    if (addr[1] == 0x01) {
+                        // disallow 2001:0::/32 (Teredo RFC 4380)
+                        if (addr[2] == 0x00 && addr[3] == 0x00)
+                            return false;
+                        // Documenation (example) RFC 3849
+                        if (addr[2] == 0x0d && (addr[3] & 0xff) == 0xb8)
+                            return false;
+                    }
+                }
                 // disallow fc00::/8 and fd00::/8 (Unique local addresses RFC 4193)
                 // not recognized as local by InetAddress
                 if ((addr[0] & 0xfe) == 0xfc)
                     return false;
-                // disallow 2001:0::/32 (Teredo RFC 4380)
-                if (addr[0] == 0x20 && addr[1] == 0x01 && addr[2] == 0x00 && addr[3] == 0x00)
-                    return false;
                 // Hamachi IPv6
                 if (addr[0] == 0x26 && addr[1] == 0x20 && addr[2] == 0x00 && (addr[3] & 0xff) == 0x9b)
                     return false;
                 // 6bone RFC 2471
                 if (addr[0] == 0x3f && (addr[1] & 0xff) == 0xfe)
                     return false;
-                // Documenation (example) RFC 3849
-                if (addr[0] == 0x20 && addr[1] == 0x01 && addr[2] == 0x0d && (addr[3] & 0xff) == 0xb8)
-                    return false;
                 try {
                     InetAddress ia = InetAddress.getByAddress(addr);
                     return
-- 
GitLab