Author: toad
Date: 2007-12-04 15:28:57 +0000 (Tue, 04 Dec 2007)
New Revision: 16264

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
Log:
Pad noderefs to next kB from 3K to 32K. After that, refuse to send them.

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-12-04 15:17:59 UTC 
(rev 16263)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-12-04 15:28:57 UTC 
(rev 16264)
@@ -468,7 +468,7 @@
         * @throws NotConnectedException If the peer becomes disconnected while 
we are trying to send the noderef.
         */
        public void sendOpennetRef(boolean isReply, long uid, PeerNode peer, 
byte[] noderef, ByteCounter ctr) throws NotConnectedException {
-               byte[] padded = new byte[PADDED_NODEREF_SIZE];
+               byte[] padded = new byte[paddedSize(noderef.length)];
                if(noderef.length > padded.length) {
                        Logger.error(this, "Noderef too big: "+noderef.length+" 
bytes");
                        return;
@@ -506,7 +506,7 @@

        public void sendAnnouncementRequest(long uid, PeerNode peer, byte[] 
noderef, ByteCounter ctr, 
                        double target, short htl, double nearestLocSoFar) 
throws NotConnectedException {
-               byte[] padded = new byte[PADDED_NODEREF_SIZE];
+               byte[] padded = new byte[paddedSize(noderef.length)];
                if(noderef.length > padded.length) {
                        Logger.error(this, "Noderef too big: "+noderef.length+" 
bytes");
                        return;
@@ -520,6 +520,14 @@
                innerSendOpennetRef(xferUID, padded, peer);
        }

+       private int paddedSize(int length) {
+               if(length < PADDED_NODEREF_SIZE) return PADDED_NODEREF_SIZE;
+               Logger.normal(this, "Large noderef: "+length);
+               if(length > MAX_OPENNET_NODEREF_LENGTH)
+                       throw new IllegalArgumentException("Too big noderef: 
"+length+" limit is "+MAX_OPENNET_NODEREF_LENGTH);
+               return ((length >>> 10) + ((length & 1023) == 0 ? 0 : 1)) << 10;
+       }
+
        public void sendAnnouncementReply(long uid, PeerNode peer, byte[] 
noderef, ByteCounter ctr) 
        throws NotConnectedException {
                byte[] padded = new byte[PADDED_NODEREF_SIZE];


Reply via email to