Author: nextgens
Date: 2008-04-14 06:21:05 +0000 (Mon, 14 Apr 2008)
New Revision: 19304
Modified:
trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
trunk/freenet/src/freenet/keys/ClientCHKBlock.java
trunk/freenet/src/freenet/keys/FreenetURI.java
trunk/freenet/src/freenet/node/FailureTable.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/support/LoggerHookChain.java
trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
Log:
some paranoia code to prevent race conditions and out-of-bound exceptions
Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-04-14 05:28:57 UTC (rev 19303)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-04-14 06:21:05 UTC (rev 19304)
@@ -531,10 +531,11 @@
}
} else {
SendableGet[] gets = (SendableGet[]) o;
- SendableGet[] newGets = new
SendableGet[gets.length-1];
+ final int getsLength = gets.length;
+ SendableGet[] newGets = new
SendableGet[getsLength > 1 ? getsLength-1 : 0];
boolean found = false;
int x = 0;
- for(int j=0;j<gets.length;j++) {
+ for(int j=0;j<getsLength;j++) {
if(gets[j] == getter) {
found = true;
continue;
@@ -542,7 +543,7 @@
if(j == newGets.length) {
if(!found) {
if(complain)
-
Logger.normal(this, "Not found: "+getter+" for "+key+" removing
("+gets.length+" getters)");
+
Logger.normal(this, "Not found: "+getter+" for "+key+" removing ("+getsLength+"
getters)");
return; // not here
}
}
@@ -555,7 +556,7 @@
} else if(x == 1) {
pendingKeys.put(key, newGets[0]);
} else {
- if(x != gets.length-1) {
+ if(x != -1) {
SendableGet[] newNewGets = new
SendableGet[x];
System.arraycopy(newGets, 0,
newNewGets, 0, x);
newGets = newNewGets;
Modified: trunk/freenet/src/freenet/keys/ClientCHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientCHKBlock.java 2008-04-14 05:28:57 UTC
(rev 19303)
+++ trunk/freenet/src/freenet/keys/ClientCHKBlock.java 2008-04-14 06:21:05 UTC
(rev 19304)
@@ -89,7 +89,8 @@
throw new CHKDecodeException("Crypto key too short");
cipher.initialize(key.cryptoKey);
PCFBMode pcfb = PCFBMode.create(cipher);
- byte[] hbuf = new byte[headers.length > 2 ? headers.length-2 : 0];
+ int headersLength = headers.length;
+ byte[] hbuf = new byte[headersLength > 2 ? headersLength-2 : 0];
System.arraycopy(headers, 2, hbuf, 0, hbuf.length);
byte[] dbuf = new byte[data.length];
System.arraycopy(data, 0, dbuf, 0, data.length);
Modified: trunk/freenet/src/freenet/keys/FreenetURI.java
===================================================================
--- trunk/freenet/src/freenet/keys/FreenetURI.java 2008-04-14 05:28:57 UTC
(rev 19303)
+++ trunk/freenet/src/freenet/keys/FreenetURI.java 2008-04-14 06:21:05 UTC
(rev 19304)
@@ -434,8 +434,9 @@
*/
public FreenetURI popMetaString() {
String[] newMetaStr = null;
- if ((metaStr != null) && (metaStr.length > 1)) {
- newMetaStr = new String[metaStr.length - 1];
+ final int metaStrLength = metaStr.length;
+ if ((metaStr != null) && (metaStrLength > 1)) {
+ newMetaStr = new String[metaStrLength - 1];
System.arraycopy(metaStr, 1, newMetaStr, 0,
newMetaStr.length);
}
return setMetaString(newMetaStr);
Modified: trunk/freenet/src/freenet/node/FailureTable.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTable.java 2008-04-14 05:28:57 UTC
(rev 19303)
+++ trunk/freenet/src/freenet/node/FailureTable.java 2008-04-14 06:21:05 UTC
(rev 19304)
@@ -154,12 +154,13 @@
if(logMINOR) Logger.minor(this, "Deleting "+offer+"
from "+this);
synchronized(this) {
int idx = -1;
- for(int i=0;i<offers.length;i++) {
+ final int offerLength = offers.length;
+ for(int i=0;i<offerLength;i++) {
if(offers[i] == offer) idx = i;
}
if(idx == -1) return;
if(offers.length > 1) {
- BlockOffer[] newOffers = new
BlockOffer[offers.length-1];
+ BlockOffer[] newOffers = new
BlockOffer[offerLength > 1 ? offerLength-1 : 0];
if(idx > 0)
System.arraycopy(offers, 0,
newOffers, 0, idx);
if(idx < newOffers.length)
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2008-04-14 05:28:57 UTC
(rev 19303)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2008-04-14 06:21:05 UTC
(rev 19304)
@@ -319,7 +319,8 @@
connectedPeers = newConnectedPeers;
// removing from myPeers
- PeerNode[] newMyPeers = new PeerNode[myPeers.length-1];
+ int myPeerLength = myPeers.length;
+ PeerNode[] newMyPeers = new PeerNode[myPeerLength > 1 ?
myPeerLength-1 : 0];
int positionInNewArray = 0;
for(int i=0;i<myPeers.length;i++) {
if(myPeers[i]!=pn){
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2008-04-14 05:28:57 UTC
(rev 19303)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2008-04-14 06:21:05 UTC
(rev 19304)
@@ -3637,8 +3637,9 @@
}
public synchronized boolean completedAnnounce(long uid) {
- if(runningAnnounceUIDs.length == 0) return false;
- long[] newList = new long[runningAnnounceUIDs.length - 1];
+ final int runningAnnounceUIDsLength =
runningAnnounceUIDs.length;
+ if(runningAnnounceUIDsLength < 1) return false;
+ long[] newList = new long[runningAnnounceUIDsLength - 1];
int x = 0;
for(int i=0;i<runningAnnounceUIDs.length;i++) {
if(i == runningAnnounceUIDs.length) return false;
Modified: trunk/freenet/src/freenet/support/LoggerHookChain.java
===================================================================
--- trunk/freenet/src/freenet/support/LoggerHookChain.java 2008-04-14
05:28:57 UTC (rev 19303)
+++ trunk/freenet/src/freenet/support/LoggerHookChain.java 2008-04-14
06:21:05 UTC (rev 19304)
@@ -59,10 +59,11 @@
* Remove a hook from the logger.
*/
public synchronized void removeHook(LoggerHook lh) {
- LoggerHook[] newHooks = new LoggerHook[hooks.length-1];
+ final int hooksLength = hooks.length;
+ LoggerHook[] newHooks = new LoggerHook[hooksLength > 1 ? hooksLength-1
: 0];
int x=0;
boolean removed = false;
- for(int i=0;i<hooks.length;i++) {
+ for(int i=0;i<hooksLength;i++) {
if(hooks[i] == lh) {
removed = true;
} else {
Modified: trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
===================================================================
--- trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
2008-04-14 05:28:57 UTC (rev 19303)
+++ trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
2008-04-14 06:21:05 UTC (rev 19304)
@@ -124,16 +124,17 @@
// Just because the item is cancelled does not
necessarily mean the whole client is.
// E.g. a segment may return cancelled because it is
decoding, that doesn't mean
// other segments are cancelled. So just go around the
loop in that case.
+ final int grabArraysLength = grabArrays.length;
if(rga.isEmpty()) {
if(logMINOR)
Logger.minor(this, "Removing grab array
"+x+" : "+rga+" for "+rga.getObject()+" (is empty)");
Object client = rga.getObject();
grabArraysByClient.remove(client);
- RemoveRandomWithObject[] newArray = new
RemoveRandomWithObject[grabArrays.length-1];
+ RemoveRandomWithObject[] newArray = new
RemoveRandomWithObject[grabArraysLength > 1 ? grabArraysLength-1 : 0];
if(x > 0)
System.arraycopy(grabArrays, 0,
newArray, 0, x);
- if(x < grabArrays.length-1)
- System.arraycopy(grabArrays, x+1,
newArray, x, grabArrays.length - (x+1));
+ if(x < grabArraysLength-1)
+ System.arraycopy(grabArrays, x+1,
newArray, x, grabArraysLength - (x+1));
grabArrays = newArray;
}
if(item == null) {
@@ -141,7 +142,7 @@
// Hmmm...
excluded++;
if(excluded > MAX_EXCLUDED) {
- Logger.normal(this, "Too many
sub-arrays are entirely excluded on "+this+" length = "+grabArrays.length, new
Exception("error"));
+ Logger.normal(this, "Too many
sub-arrays are entirely excluded on "+this+" length = "+grabArraysLength, new
Exception("error"));
return null;
}
}