From d87d4eb232365c2c1a277cc8203d0a2f05f0ff43 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 5 Dec 2013 16:14:51 +0000
Subject: [PATCH] I2CP: Disconnect client on attempt to publish invalid
 leaseset

---
 .../router/client/ClientMessageEventListener.java    | 12 ++++++++++--
 .../kademlia/KademliaNetworkDatabaseFacade.java      |  7 +++++--
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 4c6b5dd411..6ea78a0630 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -289,14 +289,22 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         if ( (message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null) ) {
             if (_log.shouldLog(Log.ERROR))
                 _log.error("Null lease set granted: " + message);
+            _runner.disconnectClient("Invalid CreateLeaseSetMessage");
             return;
         }
 
+        _context.keyManager().registerKeys(message.getLeaseSet().getDestination(), message.getSigningPrivateKey(), message.getPrivateKey());
+        try {
+            _context.netDb().publish(message.getLeaseSet());
+        } catch (IllegalArgumentException iae) {
+            if (_log.shouldLog(Log.ERROR))
+                _log.error("Invalid leaseset from client", iae);
+            _runner.disconnectClient("Invalid leaseset: " + iae);
+            return;
+        }
         if (_log.shouldLog(Log.INFO))
             _log.info("New lease set granted for destination " 
                       + message.getLeaseSet().getDestination().calculateHash().toBase64());
-        _context.keyManager().registerKeys(message.getLeaseSet().getDestination(), message.getSigningPrivateKey(), message.getPrivateKey());
-        _context.netDb().publish(message.getLeaseSet());
 
         // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
         _runner.leaseSetCreated(message.getLeaseSet());
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 851e7897ce..10c3560e1d 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -527,14 +527,17 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     
     private static final long PUBLISH_DELAY = 3*1000;
 
-    public void publish(LeaseSet localLeaseSet) {
+    /**
+     * @throws IllegalArgumentException if the leaseSet is not valid
+     */
+    public void publish(LeaseSet localLeaseSet) throws IllegalArgumentException {
         if (!_initialized) return;
         Hash h = localLeaseSet.getDestination().calculateHash();
         try {
             store(h, localLeaseSet);
         } catch (IllegalArgumentException iae) {
             _log.error("wtf, locally published leaseSet is not valid?", iae);
-            return;
+            throw iae;
         }
         if (!_context.clientManager().shouldPublishLeaseSet(h))
             return;
-- 
GitLab