From ac3c2d2b1518535235b3a7e9412747b6cf7feaf3 Mon Sep 17 00:00:00 2001 From: jrandom Date: Wed, 5 Apr 2006 17:08:04 +0000 Subject: [PATCH] * 2006-04-05 0.6.1.14 released --- core/java/src/net/i2p/CoreVersion.java | 4 +- history.txt | 4 +- initialNews.xml | 4 +- installer/install.xml | 2 +- news.xml | 10 ++--- .../i2p/data/i2np/DatabaseLookupMessage.java | 6 +-- .../net/i2p/data/i2np/I2NPMessageImpl.java | 16 +++++--- .../src/net/i2p/router/RouterVersion.java | 6 +-- .../FloodfillNetworkDatabaseFacade.java | 1 + .../router/transport/udp/MessageReceiver.java | 7 +++- .../transport/udp/OutboundMessageState.java | 40 ++++++++++--------- .../i2p/router/tunnel/TunnelDispatcher.java | 2 +- 12 files changed, 58 insertions(+), 44 deletions(-) diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 20cf3271c..e06249fe3 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -14,8 +14,8 @@ package net.i2p; * */ public class CoreVersion { - public final static String ID = "$Revision: 1.55 $ $Date: 2006/02/27 14:05:41 $"; - public final static String VERSION = "0.6.1.13"; + public final static String ID = "$Revision: 1.56 $ $Date: 2006/03/26 18:23:49 $"; + public final static String VERSION = "0.6.1.14"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/history.txt b/history.txt index 0eb053776..7c677461c 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,6 @@ -$Id: history.txt,v 1.444 2006/04/04 07:20:39 jrandom Exp $ +$Id: history.txt,v 1.445 2006/04/04 23:40:04 jrandom Exp $ + +* 2006-04-05 0.6.1.14 released 2006-04-05 jrandom * Cut down on the time that we allow a tunnel creation request to sit by diff --git a/initialNews.xml b/initialNews.xml index 7effe02ff..c0ab5464e 100644 --- a/initialNews.xml +++ b/initialNews.xml @@ -1,5 +1,5 @@ - - + i2p - 0.6.1.13 + 0.6.1.14 diff --git a/news.xml b/news.xml index 3e31e1b33..a570bea42 100644 --- a/news.xml +++ b/news.xml @@ -1,5 +1,5 @@ - - + • -2006-03-26: -0.6.1.13 released -with improvements to load balancing, NetDB operation, new graphs and multiple fixes. -Upgrading highly recommended. +2006-04-05: 0.6.1.14 released with important tunnel reliability, ssu, and peer +selection fixes.
• 2006-04-04: diff --git a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java index 14a91b550..4a6da92e3 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java @@ -44,9 +44,9 @@ public class DatabaseLookupMessage extends I2NPMessageImpl { } public DatabaseLookupMessage(I2PAppContext context, boolean locallyCreated) { super(context); - setSearchKey(null); - setFrom(null); - setDontIncludePeers(null); + //setSearchKey(null); + //setFrom(null); + //setDontIncludePeers(null); context.statManager().createRateStat("router.throttleNetDbDoSSend", "How many netDb lookup messages we are sending during a period with a DoS detected", "Throttle", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java index 62750bacc..0e34438f1 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java @@ -290,7 +290,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM public void readMessage(byte data[], int offset, int dataSize, int type, I2NPMessageHandler handler) throws I2NPMessageException, IOException { // ignore the handler (overridden in subclasses if necessary - readMessage(data, offset, dataSize, type); + try { + readMessage(data, offset, dataSize, type); + } catch (IllegalArgumentException iae) { + throw new I2NPMessageException("Error reading the message", iae); + } } @@ -313,21 +317,23 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM return msg; } - long expiration = DataHelper.fromLong(buffer, offset, 4) * 1000; // seconds - offset += 4; - int dataSize = len - 1 - 4; try { + long expiration = DataHelper.fromLong(buffer, offset, 4) * 1000; // seconds + offset += 4; + int dataSize = len - 1 - 4; msg.readMessage(buffer, offset, dataSize, type, handler); msg.setMessageExpiration(expiration); msg.read(); return msg; } catch (IOException ioe) { throw new I2NPMessageException("IO error reading raw message", ioe); + } catch (IllegalArgumentException iae) { + throw new I2NPMessageException("Corrupt message (negative expiration)", iae); } } protected void verifyUnwritten() { - // if (_written) throw new RuntimeException("Already written"); + if (_written) throw new RuntimeException("Already written"); } protected void written() { _written = true; } protected void read() { _read = true; } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 40633d004..7ebba90ae 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.384 $ $Date: 2006/04/03 05:07:25 $"; - public final static String VERSION = "0.6.1.13"; - public final static long BUILD = 5; + public final static String ID = "$Revision: 1.385 $ $Date: 2006/04/04 23:40:10 $"; + public final static String VERSION = "0.6.1.14"; + public final static long BUILD = 0; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index cb69c9e3a..776e10211 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -129,6 +129,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad */ SearchJob search(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, boolean isLease) { //if (true) return super.search(key, onFindJob, onFailedLookupJob, timeoutMs, isLease); + if (key == null) throw new IllegalArgumentException("searchin for nothin, eh?"); boolean isNew = true; FloodSearchJob searchJob = null; synchronized (_activeFloodQueries) { diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index b28df9ede..64e8a2d65 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -156,8 +156,11 @@ public class MessageReceiver { + " raw: " + Base64.encode(fragments[i].getData()) + ")"); off += fragments[i].getValid(); } - if (off != state.getCompleteSize()) - _log.error("Hmm, offset of the fragments = " + off + " while the state says " + state.getCompleteSize()); + if (off != state.getCompleteSize()) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Hmm, offset of the fragments = " + off + " while the state says " + state.getCompleteSize()); + return null; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("Raw byte array for " + state.getMessageId() + ": " + Base64.encode(buf.getData(), 0, state.getCompleteSize())); I2NPMessage m = I2NPMessageImpl.fromRawByteArray(_context, buf.getData(), 0, state.getCompleteSize(), handler); diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java index 1b942d808..e170334dc 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -47,8 +47,7 @@ public class OutboundMessageState { public boolean initialize(OutNetMessage msg) { if (msg == null) return false; try { - initialize(msg, msg.getMessage(), null); - return true; + return initialize(msg, msg.getMessage(), null); } catch (OutOfMemoryError oom) { throw oom; } catch (Exception e) { @@ -62,8 +61,7 @@ public class OutboundMessageState { return false; try { - initialize(null, msg, peer); - return true; + return initialize(null, msg, peer); } catch (OutOfMemoryError oom) { throw oom; } catch (Exception e) { @@ -77,8 +75,7 @@ public class OutboundMessageState { return false; try { - initialize(m, msg, null); - return true; + return initialize(m, msg, null); } catch (OutOfMemoryError oom) { throw oom; } catch (Exception e) { @@ -87,7 +84,7 @@ public class OutboundMessageState { } } - private void initialize(OutNetMessage m, I2NPMessage msg, PeerState peer) { + private boolean initialize(OutNetMessage m, I2NPMessage msg, PeerState peer) { _message = m; _peer = peer; if (_messageBuf != null) { @@ -99,17 +96,24 @@ public class OutboundMessageState { int size = msg.getRawMessageSize(); if (size > _messageBuf.getData().length) throw new IllegalArgumentException("Size too large! " + size + " in " + msg); - int len = msg.toRawByteArray(_messageBuf.getData()); - _messageBuf.setValid(len); - _messageId = msg.getUniqueId(); - - _startedOn = _context.clock().now(); - _nextSendTime = _startedOn; - _expiration = _startedOn + 10*1000; - //_expiration = msg.getExpiration(); - - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Raw byte array for " + _messageId + ": " + Base64.encode(_messageBuf.getData(), 0, len)); + try { + int len = msg.toRawByteArray(_messageBuf.getData()); + _messageBuf.setValid(len); + _messageId = msg.getUniqueId(); + + _startedOn = _context.clock().now(); + _nextSendTime = _startedOn; + _expiration = _startedOn + 10*1000; + //_expiration = msg.getExpiration(); + + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Raw byte array for " + _messageId + ": " + Base64.encode(_messageBuf.getData(), 0, len)); + return true; + } catch (IllegalStateException ise) { + _cache.release(_messageBuf); + _messageBuf = null; + return false; + } } public void releaseResources() { diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java index 9156537a0..8f587c5e6 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java @@ -435,7 +435,7 @@ public class TunnelDispatcher implements Service { _context.statManager().addRateData("tunnel.dispatchInbound", 1, 0); } else { _context.messageHistory().droppedTunnelGatewayMessageUnknown(msg.getUniqueId(), msg.getTunnelId().getTunnelId()); - int level = (_context.router().getUptime() > 10*60*1000 ? Log.ERROR : Log.WARN); + int level = (_context.router().getUptime() > 10*60*1000 ? Log.WARN : Log.INFO); if (_log.shouldLog(level)) _log.log(level, "no matching tunnel for id=" + msg.getTunnelId().getTunnelId() + ": gateway message expiring in "