From 5fcafb6434bb89980d3612a4c056deb163e77cb3 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 2 Aug 2016 14:28:34 +0000
Subject: [PATCH] i2psnark: Fix SIOOBE on bad announce URL (ticket #1823)

---
 .../java/src/org/klomp/snark/TrackerClient.java   | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index fb899bcbd2..bf6059d439 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -893,11 +893,16 @@ public class TrackerClient implements Runnable {
     } catch (URISyntaxException use) {
         return false;
     }
+    String path = url.getPath();
+    if (path == null || !path.startsWith("/"))
+        return false;
     return "http".equals(url.getScheme()) && url.getHost() != null &&
            (url.getHost().endsWith(".i2p") || url.getHost().equals("i2p"));
   }
 
   /**
+   *  This also validates the URL.
+   *
    *  @param ann an announce URL non-null
    *  @return a Hash for i2p hosts only, null otherwise
    *  @since 0.9.5
@@ -914,8 +919,12 @@ public class TrackerClient implements Runnable {
     String host = url.getHost();
     if (host == null)
         return null;
-    if (host.endsWith(".i2p"))
+    if (host.endsWith(".i2p")) {
+        String path = url.getPath();
+        if (path == null || !path.startsWith("/"))
+            return null;
         return ConvertToHash.getHash(host);
+    }
     if (host.equals("i2p")) {
         String path = url.getPath();
         if (path == null || path.length() < 517 ||
@@ -941,6 +950,10 @@ public class TrackerClient implements Runnable {
       int consecutiveFails;
       int seenPeers;
 
+      /**
+       *  @param a must be a valid http URL with a path
+       *  @param p true if primary
+       */
       public TCTracker(String a, boolean p)
       {
           announce = a;
-- 
GitLab