* Matthew Toseland <toad at amphibian.dyndns.org> [2008-04-14 22:49:22]:

> On Monday 14 April 2008 06:28, nextgens at freenetproject.org wrote:
> > Author: nextgens
> > Date: 2008-04-14 05:28:57 +0000 (Mon, 14 Apr 2008)
> > New Revision: 19303
> > 
> > Modified:
> >    trunk/freenet/src/freenet/keys/ClientCHKBlock.java
> >    trunk/freenet/src/freenet/node/FNPPacketMangler.java
> >    trunk/freenet/src/freenet/node/LocationManager.java
> > Log:
> > fix two potential security weaknesses (Would thow ArrayOutOfBounds)
> > 
> > Modified: trunk/freenet/src/freenet/keys/ClientCHKBlock.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/keys/ClientCHKBlock.java      2008-04-14 
> > 04:29:38 
> UTC (rev 19302)
> > +++ trunk/freenet/src/freenet/keys/ClientCHKBlock.java      2008-04-14 
> > 05:28:57 
> UTC (rev 19303)
> > @@ -89,8 +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];
> > -        System.arraycopy(headers, 2, hbuf, 0, headers.length-2);
> > +        byte[] hbuf = new byte[headers.length > 2 ? headers.length-2 : 0];
> > +        System.arraycopy(headers, 2, hbuf, 0, hbuf.length);
> 
> I disagree. We should throw. And we do, in the CHKBlock constructor. Please 
> revert.

Okay, for some reason I've missed the test in the constructor :$

Still, as CHKBlock isn't "final" I think that we could do an extra test here.

> 
> >          byte[] dbuf = new byte[data.length];
> >          System.arraycopy(data, 0, dbuf, 0, data.length);
> >          // Decipher header first - functions as IV
> > 
> > Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/node/FNPPacketMangler.java    2008-04-14 
> > 04:29:38 
> UTC (rev 19302)
> > +++ trunk/freenet/src/freenet/node/FNPPacketMangler.java    2008-04-14 
> > 05:28:57 
> UTC (rev 19303)
> > @@ -1124,7 +1124,7 @@
> >             byte[] data = new byte[decypheredPayload.length - 
> decypheredPayloadOffset];
> >             System.arraycopy(decypheredPayload, decypheredPayloadOffset, 
> > data, 0, 
> decypheredPayload.length - decypheredPayloadOffset);
> >             long bootID = Fields.bytesToLong(data);
> > -           byte[] hisRef = new byte[data.length -8];
> > +           byte[] hisRef = new byte[data.length > 8 ? data.length -8 : 0];
> 
> Here we definitely shouldn't swallow it silently, we should log it and kill 
> the packet, as we do with other formatting errors. We should not allocate a 
> zero length array and then have devs running in circles trying to figure out 
> what's going on!

Fixed

> 
> >             System.arraycopy(data, 8, hisRef, 0, hisRef.length);
> >             
> >             // construct the peernode
> > 
> > Modified: trunk/freenet/src/freenet/node/LocationManager.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/node/LocationManager.java     2008-04-14 
> > 04:29:38 
> UTC (rev 19302)
> > +++ trunk/freenet/src/freenet/node/LocationManager.java     2008-04-14 
> > 05:28:57 
> UTC (rev 19303)
> > @@ -349,7 +349,7 @@
> >              }
> >              registerKnownLocation(hisLoc);
> >              
> > -            double[] hisFriendLocs = new double[hisBufLong.length-2];
> > +            double[] hisFriendLocs = new double[hisBufLong.length > 2 ? 
> hisBufLong.length-2 : 0];
> >              for(int i=0;i<hisFriendLocs.length;i++) {
> >                  hisFriendLocs[i] = 
> Double.longBitsToDouble(hisBufLong[i+2]);
> >                  if((hisFriendLocs[i] < 0.0) || (hisFriendLocs[i] > 1.0)) {
> > @@ -546,7 +546,7 @@
> >                  }
> >                  registerKnownLocation(hisLoc);
> >                  
> > -                double[] hisFriendLocs = new double[hisBufLong.length-2];
> > +                double[] hisFriendLocs = new double[hisBufLong.length > 2 
> > ? 
> hisBufLong.length-2 : 0];
> 
> Likewise here, we should do proper error handling. It's not that hard.

Is it acceptable for a swaprequest not to have any 'friend location' ?

See what I've commited in r19342
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20080415/081be6a3/attachment.pgp>

Reply via email to