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;
                                        }
                                }


Reply via email to