From 0afabbd609fc057a7dcb2a8db2ee8622ccd55832 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 31 Oct 2010 14:36:56 +0000
Subject: [PATCH] Add synch to fix race causing AIOOBE
 http://forum.i2p/viewtopic.php?t=5061

---
 .../router/client/ClientConnectionRunner.java | 27 ++++++++++---------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 42eef3480b..1c4fb2fd5e 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -361,18 +361,21 @@ public class ClientConnectionRunner {
         // TunnelPool.locked_buildNewLeaseSet() ensures that leases are sorted,
         //  so the comparison will always work.
         int leases = set.getLeaseCount();
-        if (_currentLeaseSet != null && _currentLeaseSet.getLeaseCount() == leases) {
-            for (int i = 0; i < leases; i++) {
-                if (! _currentLeaseSet.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId()))
-                    break;
-                if (! _currentLeaseSet.getLease(i).getGateway().equals(set.getLease(i).getGateway()))
-                    break;
-                if (i == leases - 1) {
-                    if (_log.shouldLog(Log.INFO))
-                        _log.info("Requested leaseSet hasn't changed");
-                    if (onCreateJob != null)
-                        _context.jobQueue().addJob(onCreateJob);
-                    return; // no change
+        // synch so _currentLeaseSet isn't changed out from under us
+        synchronized (this) {
+            if (_currentLeaseSet != null && _currentLeaseSet.getLeaseCount() == leases) {
+                for (int i = 0; i < leases; i++) {
+                    if (! _currentLeaseSet.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId()))
+                        break;
+                    if (! _currentLeaseSet.getLease(i).getGateway().equals(set.getLease(i).getGateway()))
+                        break;
+                    if (i == leases - 1) {
+                        if (_log.shouldLog(Log.INFO))
+                            _log.info("Requested leaseSet hasn't changed");
+                        if (onCreateJob != null)
+                            _context.jobQueue().addJob(onCreateJob);
+                        return; // no change
+                    }
                 }
             }
         }
-- 
GitLab