Add synch to fix race causing AIOOBE

http://forum.i2p/viewtopic.php?t=5061
This commit is contained in:
zzz
2010-10-31 14:36:56 +00:00
parent 2ea3f9b9bb
commit 0afabbd609

View File

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