From 1ab8200c7f2e0cf41014cd26cdea06b4c802376f Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 6 Aug 2012 14:45:37 +0000 Subject: [PATCH] * Clone System properties before iterating to avoid ConcurrentModificationException (ticket #680) --- .../client/streaming/I2PSocketManagerFactory.java | 14 ++++++++------ .../sam/java/src/net/i2p/sam/SAMStreamSession.java | 3 +-- .../java/src/net/i2p/sam/SAMv3StreamSession.java | 3 +-- core/java/src/net/i2p/I2PAppContext.java | 7 ++++--- core/java/src/net/i2p/client/I2PSessionImpl.java | 2 +- history.txt | 7 +++++++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- 7 files changed, 23 insertions(+), 15 deletions(-) diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java index 113d1e7ffd..5c864110a3 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.util.Iterator; +import java.util.Map; import java.util.Properties; import net.i2p.I2PAppContext; @@ -36,7 +37,7 @@ public class I2PSocketManagerFactory { * @return the newly created socket manager, or null if there were errors */ public static I2PSocketManager createManager() { - return createManager(getHost(), getPort(), System.getProperties()); + return createManager(getHost(), getPort(), (Properties) System.getProperties().clone()); } /** @@ -59,7 +60,7 @@ public class I2PSocketManagerFactory { * @return the newly created socket manager, or null if there were errors */ public static I2PSocketManager createManager(String host, int port) { - return createManager(host, port, System.getProperties()); + return createManager(host, port, (Properties) System.getProperties().clone()); } /** @@ -95,7 +96,7 @@ public class I2PSocketManagerFactory { * @return the newly created socket manager, or null if there were errors */ public static I2PSocketManager createManager(InputStream myPrivateKeyStream) { - return createManager(myPrivateKeyStream, getHost(), getPort(), System.getProperties()); + return createManager(myPrivateKeyStream, getHost(), getPort(), (Properties) System.getProperties().clone()); } /** @@ -126,10 +127,11 @@ public class I2PSocketManagerFactory { I2PClient client = I2PClientFactory.createClient(); if (opts == null) opts = new Properties(); - for (Iterator iter = System.getProperties().keySet().iterator(); iter.hasNext(); ) { - String name = (String)iter.next(); + Properties syscopy = (Properties) System.getProperties().clone(); + for (Map.Entry e : syscopy.entrySet()) { + String name = (String) e.getKey(); if (!opts.containsKey(name)) - opts.setProperty(name, System.getProperty(name)); + opts.setProperty(name, (String) e.getValue()); } //boolean oldLib = DEFAULT_MANAGER.equals(opts.getProperty(PROP_MANAGER, DEFAULT_MANAGER)); //if (oldLib && false) { diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java index d43f3a576d..ab5d9068b7 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java @@ -124,8 +124,7 @@ public class SAMStreamSession { _log.debug("SAM STREAM session instantiated"); - Properties allprops = new Properties(); - allprops.putAll(System.getProperties()); + Properties allprops = (Properties) System.getProperties().clone(); allprops.putAll(props); String i2cpHost = allprops.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java index 699058613c..159798f601 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java @@ -85,8 +85,7 @@ public class SAMv3StreamSession extends SAMStreamSession implements SAMv3Handle _log.debug("SAM STREAM session instantiated"); - Properties allprops = new Properties(); - allprops.putAll(System.getProperties()); + Properties allprops = (Properties) System.getProperties().clone(); allprops.putAll(rec.getProps()); String i2cpHost = allprops.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index 313f6e445e..15189f876e 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -516,7 +516,8 @@ public class I2PAppContext { * @return set of Strings containing the names of defined system properties */ public Set getPropertyNames() { - Set names = new HashSet(System.getProperties().keySet()); + // clone to avoid ConcurrentModificationException + Set names = new HashSet(((Properties) System.getProperties().clone()).keySet()); if (_overrideProps != null) names.addAll(_overrideProps.keySet()); return names; @@ -531,8 +532,8 @@ public class I2PAppContext { * @since 0.8.4 */ public Properties getProperties() { - Properties rv = new Properties(); - rv.putAll(System.getProperties()); + // clone to avoid ConcurrentModificationException + Properties rv = (Properties) System.getProperties().clone(); rv.putAll(_overrideProps); return rv; } diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java index ed670149f5..349f3d6782 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl.java @@ -164,7 +164,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa _log = context.logManager().getLog(getClass()); _closed = true; if (options == null) - options = System.getProperties(); + options = (Properties) System.getProperties().clone(); loadConfig(options); } diff --git a/history.txt b/history.txt index eae3314f08..b2a84d686e 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,10 @@ +2012-08-06 zzz + * Clone System properties before iterating to avoid + ConcurrentModificationException (ticket #680) + * Console: Fix flag links on /console to return to same page + * i2psnark: Add support for DHT (disabled by default) + * jbigi: Add ARMv6 libjbigi.so for Raspberry Pi + 2012-08-05 zzz * I2PSessionImpl: One more volatile (ticket #659) * i2ptunnel, I2CP, EepGet: Buffer socket input streams (ticket #666) diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 0725033fa6..f6e6df3a5c 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 3; + public final static long BUILD = 4; /** for example "-test" */ public final static String EXTRA = "";