diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index b9e010867..ec2f3368c 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -4879,7 +4879,7 @@ public class I2PSnarkServlet extends BasicServlet { if (oldCreatedBy == null) oldCreatedBy = ""; if (toAdd.isEmpty() && toDel.isEmpty() && - (primary == null || primary.equals(oldPrimary)) && + (primary == null || (oldPrimary != null && primary.intValue() == oldPrimary.hashCode())) && oldComment.equals(newComment) && oldCreatedBy.equals(newCreatedBy)) { _manager.addMessage("No changes to torrent, not saved"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index 19aa55a59..e689521dc 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -231,10 +231,10 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { // fall thru for -nogui only case NOGUI: // --nogui - gui = false; if (_log.shouldLog(Log.WARN)) _log.warn(getPrefix() + "The `-nogui' option of I2PTunnel is deprecated.\n" + "Use `-cli', `-nocli' (aka `-wait') or `-die' instead."); + // fall thru for -nogui only case 'c': // -c, -cli, --cli gui = false; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java index 639881cfd..db57c6953 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java @@ -175,7 +175,7 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner { * * @since 0.9.62 */ - private class I2PSocketCloser extends I2PAppThread { + private static class I2PSocketCloser extends I2PAppThread { private final InputStream in; private final OutputStream out; private final I2PSocket s; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java index 4483961e7..66fe1ac86 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java @@ -710,23 +710,19 @@ public class TunnelControllerGroup implements ClientApp { @Deprecated public void saveConfig() throws IOException { _controllersLock.readLock().lock(); - if (shouldMigrate()) { - try { + try { + if (shouldMigrate()) { for (TunnelController controller : _controllers) { saveConfig(controller); } - } finally { - _controllersLock.readLock().unlock(); - } - } else { - try { + } else { File cfgFile = new File(_configFile); if (!cfgFile.isAbsolute()) cfgFile = new File(_context.getConfigDir(), _configFile); saveConfig(cfgFile); - } finally { - _controllersLock.readLock().unlock(); } + } finally { + _controllersLock.readLock().unlock(); } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java index 3402c23aa..0c864503a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java @@ -54,7 +54,7 @@ public class Subscriber implements Sink { if(ctrl == 0) { if (this.subscriptions.put(ms, Long.valueOf(ctx.clock().now())) == null) { if (subscriptions.size() > MAX_SUBSCRIPTIONS) { - subscriptions.remove(dest); + subscriptions.remove(ms); if (log.shouldWarn()) log.warn("Too many subscriptions, denying: " + ms); return; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index 417fa9d6b..9e0dd1aef 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -622,7 +622,7 @@ public class IndexBean { String secret = _helper.getBlindedPassword(tunnel); boolean requireSecret = secret != null && secret.length() > 0 && (mode == 3 || mode == 5 || mode == 7 || mode == 9); - boolean requireAuth = mode >= 4 && mode <= 9; + boolean requireAuth = mode >= 4; return Blinding.encode(d.getSigningPublicKey(), requireSecret, requireAuth); } catch (RuntimeException re) {} } diff --git a/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java b/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java index d9144d004..b32cded98 100644 --- a/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java +++ b/apps/jetty/java/src/net/i2p/servlet/util/ServletUtil.java @@ -86,4 +86,30 @@ public class ServletUtil { return s.substring(0, len + 2); return s.substring(0, len); } + + /** + * Sanitize an encoded String from getQueryString(). + * Does not decode. + * + * @param s may be null + * @return s or null if s was null or s contained any problematic characters + * @since 0.9.70 + */ + public static String sanitizeQuery(String s) { + if (s == null) + return null; + int len = s.length(); + for (int i = 0; i < len; i++) { + switch (s.charAt(i)) { + case '\r': + case '\n': + case '"': + case '\'': + case '<': + case '>': + return null; + } + } + return s; + } } diff --git a/apps/routerconsole/java/src/edu/internet2/ndt/Tcpbw100.java b/apps/routerconsole/java/src/edu/internet2/ndt/Tcpbw100.java index 5cf08b873..2db75ad49 100644 --- a/apps/routerconsole/java/src/edu/internet2/ndt/Tcpbw100.java +++ b/apps/routerconsole/java/src/edu/internet2/ndt/Tcpbw100.java @@ -2487,7 +2487,7 @@ public class Tcpbw100 extends JApplet implements ActionListener { * */ public void dottcp(StatusPanel sPanel) throws IOException { - Socket ctlSocket = null; + Socket ctlSocket; if (!_bIsApplication) { // @@ -2624,9 +2624,7 @@ public class Tcpbw100 extends JApplet implements ActionListener { + "\n"); // create socket to host specified by user and the default port // we seem to always get here, why bother trying extended above? - if (ctlSocket != null) { - try { ctlSocket.close(); } catch (IOException ioe) {} - } + try { ctlSocket.close(); } catch (IOException ioe) {} ctlSocket = newSocket(hostAddress, ctlport); } catch (UnknownHostException e) { _log.warn("Don't know about host: " + sHostName, e); diff --git a/apps/routerconsole/jsp/dns.jsp b/apps/routerconsole/jsp/dns.jsp index aa72a99b2..3c78cda72 100644 --- a/apps/routerconsole/jsp/dns.jsp +++ b/apps/routerconsole/jsp/dns.jsp @@ -12,7 +12,7 @@ <% // take /dns query params and pass to the iframe String isrc; - String query = request.getQueryString(); + String query = net.i2p.servlet.util.ServletUtil.sanitizeQuery(request.getQueryString()); if (query != null) isrc = "/susidns/addressbook?" + query; else diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index ad3c9abc8..9badb1962 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -44,7 +44,7 @@ } } buf.append(tgt); - String query = request.getQueryString(); + String query = net.i2p.servlet.util.ServletUtil.sanitizeQuery(request.getQueryString()); if (query != null) buf.append('?').append(query); response.setHeader("Location", buf.toString()); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java index e0ce22c46..6240dc3d5 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionHandler.java @@ -83,7 +83,7 @@ class ConnectionHandler { } } - public boolean getActive() { return _active; } + public synchronized boolean getActive() { return _active; } /** * Non-SYN packets with a zero SendStreamID may also be queued here so diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java index 692f2a2b2..72ade38f0 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/ConnectionPacketHandler.java @@ -270,14 +270,9 @@ class ConnectionPacketHandler { } } else { - if (isSYN) { - //con.incrementUnackedPacketsReceived(); - con.setNextSendTime(_context.clock().now() + con.getOptions().getSendAckDelay()); - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("ACK only packet received: " + packet); - ackOnly = true; - } + if (_log.shouldLog(Log.DEBUG)) + _log.debug("ACK only packet received: " + packet); + ackOnly = true; } } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java index 068efbf71..bf42b0d12 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketHandler.java @@ -356,8 +356,7 @@ class PacketHandler { for (Connection con : _manager.listConnections()) { buf.append(con.toString()).append(" "); } - _log.debug("connections: " + buf.toString() + " sendId: " - + (sendId > 0 ? Packet.toId(sendId) : " unknown")); + _log.debug("connections: " + buf.toString() + " sendId: unknown"); } //packet.releasePayload(); _manager.getConnectionHandler().receiveNewSyn(packet); diff --git a/apps/susimail/src/src/i2p/susi/util/Folder.java b/apps/susimail/src/src/i2p/susi/util/Folder.java index e160ee058..37cf6a048 100644 --- a/apps/susimail/src/src/i2p/susi/util/Folder.java +++ b/apps/susimail/src/src/i2p/susi/util/Folder.java @@ -557,11 +557,11 @@ public class Folder { */ public synchronized O getNextSelectedElement(O element) { - if (currentSelector == null) + if (currentSelector == null || selected == null) return getNextElement(element); O result = null; int i = selected.indexOf(element); - if (i != -1 && selected != null) { + if (i != -1) { i++; if (i < selected.size()) result = selected.get(i); @@ -578,11 +578,11 @@ public class Folder { */ public synchronized O getPreviousSelectedElement(O element) { - if (currentSelector == null) + if (currentSelector == null || selected == null) return getPreviousElement(element); O result = null; int i = selected.indexOf(element); - if (i != -1 && selected != null) { + if (i != -1) { i--; if (i >= 0 && i < selected.size()) result = selected.get(i); diff --git a/core/java/src/net/i2p/data/BlindData.java b/core/java/src/net/i2p/data/BlindData.java index ea17c6f8c..75e507a63 100644 --- a/core/java/src/net/i2p/data/BlindData.java +++ b/core/java/src/net/i2p/data/BlindData.java @@ -238,7 +238,7 @@ public class BlindData { /** * @since 0.9.41 */ - public boolean getSecretRequired() { + public synchronized boolean getSecretRequired() { return _secretRequired; } @@ -253,7 +253,7 @@ public class BlindData { /** * @since 0.9.41 */ - public boolean getAuthRequired() { + public synchronized boolean getAuthRequired() { return _authRequired; } diff --git a/core/java/src/net/i2p/util/SimpleTimer.java b/core/java/src/net/i2p/util/SimpleTimer.java index e037b647b..2769e87a6 100644 --- a/core/java/src/net/i2p/util/SimpleTimer.java +++ b/core/java/src/net/i2p/util/SimpleTimer.java @@ -157,8 +157,9 @@ public class SimpleTimer { if ( (_events.size() != _eventTimes.size()) ) { _log.error("Skewed events: " + _events.size() + " for " + _eventTimes.size()); - for (TimedEvent evt : _eventTimes.keySet()) { - Long when = _eventTimes.get(evt); + for (Map.Entry e : _eventTimes.entrySet()) { + TimedEvent evt = e.getKey(); + Long when = e.getValue(); TimedEvent cur = _events.get(when); if (cur != evt) { _log.error("event " + evt + " @ " + when + ": " + cur); diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index dd2a3770b..9781b2152 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -613,24 +613,24 @@ public class Router implements RouterClock.ClockShiftListener { * * Warning - risk of deadlock - do not call while holding locks * + * @param info non-null */ public void setRouterInfo(RouterInfo info) { _routerInfoLock.writeLock().lock(); - if (!info.getIdentity().equals(_routerIdent)) { - if (_routerIdent != null) // shouldn't happen - _log.log(Log.CRIT, "Changing router ident while running"); - _routerIdent = info.getIdentity(); - _routerHash = _routerIdent.calculateHash(); - } try { + if (!info.getIdentity().equals(_routerIdent)) { + if (_routerIdent != null) // shouldn't happen + _log.log(Log.CRIT, "Changing router ident while running"); + _routerIdent = info.getIdentity(); + _routerHash = _routerIdent.calculateHash(); + } _routerInfo = info; } finally { _routerInfoLock.writeLock().unlock(); } if (_log.shouldLog(Log.INFO)) _log.info("setRouterInfo() : " + info, new Exception("I did it")); - if (info != null) - _context.jobQueue().addJob(new PersistRouterInfoJob(_context)); + _context.jobQueue().addJob(new PersistRouterInfoJob(_context)); } /** diff --git a/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java b/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java index 965deca27..1b6d81f92 100644 --- a/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java +++ b/router/java/src/net/i2p/router/crypto/ratchet/ECIESAEADEngine.java @@ -1130,7 +1130,7 @@ public final class ECIESAEADEngine { RatchetSKM keyManager, ReplyCallback callback) { EncType type = target.getType(); - if (type != priv.getType()) + if (priv != null && type != priv.getType()) throw new IllegalArgumentException("Key mismatch " + target + ' ' + priv); HandshakeState state; try { diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index a267253c7..7d432bb62 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -1170,9 +1170,11 @@ public class ProfileOrganizer { * matches set until it has howMany elements in it. * */ +/* private void locked_selectPeers(Map peers, int howMany, Set toExclude, Set matches) { locked_selectPeers(peers, howMany, toExclude, matches, 0, null); } +*/ /** * diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index 7f4756eff..571a9d8e9 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -23,7 +23,6 @@ import net.i2p.router.TunnelPoolSettings; import net.i2p.router.message.GarlicMessageReceiver; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.util.Log; -import net.i2p.util.RandomSource; /** * When a message arrives at the inbound tunnel endpoint, this distributor @@ -54,10 +53,11 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { + " b32: " + _client.toBase32() + ") InboundMessageDistributor with tunnel pool settings: " + clienttps); _clientNickname = nickname; - _msgIDBloomXor = clienttps.getMsgIdBloomXor(); + _msgIDBloomXor = clienttps != null ? clienttps.getMsgIdBloomXor() : + ctx.random().nextLong(I2NPMessage.MAX_ID_VALUE); } else { _clientNickname = "NULL/Expl"; - _msgIDBloomXor = RandomSource.getInstance().nextLong(I2NPMessage.MAX_ID_VALUE); + _msgIDBloomXor = ctx.random().nextLong(I2NPMessage.MAX_ID_VALUE); if (_log.shouldLog(Log.DEBUG)) _log.debug("Initializing null or exploratory InboundMessageDistributor"); }