From 7a994114ff95c129507398254f56d4dc0256b8a8 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Thu, 6 Oct 2011 18:16:08 +0100 Subject: [PATCH] Synchronize access to superclass members. --- .../net/sf/briar/plugins/AbstractPlugin.java | 3 +- .../plugins/socket/SimpleSocketPlugin.java | 38 ++++++++++--------- .../sf/briar/plugins/socket/SocketPlugin.java | 8 +++- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/components/net/sf/briar/plugins/AbstractPlugin.java b/components/net/sf/briar/plugins/AbstractPlugin.java index babc90c0f6..c0259d8b0e 100644 --- a/components/net/sf/briar/plugins/AbstractPlugin.java +++ b/components/net/sf/briar/plugins/AbstractPlugin.java @@ -17,6 +17,7 @@ public abstract class AbstractPlugin implements TransportPlugin { protected final Executor executor; + // These fields should be accessed with this's lock held protected Map<String, String> localProperties = null; protected Map<ContactId, Map<String, String>> remoteProperties = null; protected Map<String, String> config = null; @@ -27,7 +28,7 @@ public abstract class AbstractPlugin implements TransportPlugin { this.executor = executor; } - protected void start(Map<String, String> localProperties, + protected synchronized void start(Map<String, String> localProperties, Map<ContactId, Map<String, String>> remoteProperties, Map<String, String> config) throws InvalidPropertiesException, InvalidConfigException { diff --git a/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java b/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java index 9233c006b9..be8d73dfe5 100644 --- a/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java +++ b/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java @@ -24,7 +24,7 @@ public class SimpleSocketPlugin extends SocketPlugin { super(executor); this.pollingInterval = pollingInterval; } - + public TransportId getId() { return id; } @@ -39,33 +39,18 @@ public class SimpleSocketPlugin extends SocketPlugin { @Override protected SocketAddress getLocalSocketAddress() { - assert localProperties != null; + assert started && localProperties != null; return createSocketAddress(localProperties); } @Override protected SocketAddress getSocketAddress(ContactId c) { - assert remoteProperties != null; + assert started && remoteProperties != null; Map<String, String> properties = remoteProperties.get(c); if(properties == null) return null; return createSocketAddress(properties); } - @Override - protected void setLocalSocketAddress(SocketAddress s) { - assert localProperties != null; - if(!(s instanceof InetSocketAddress)) - throw new IllegalArgumentException(); - InetSocketAddress i = (InetSocketAddress) s; - String host = i.getAddress().getHostAddress(); - String port = String.valueOf(i.getPort()); - // FIXME: Special handling for private IP addresses? - Map<String, String> m = new TreeMap<String, String>(localProperties); - m.put("host", host); - m.put("port", port); - callback.setLocalProperties(m); - } - private SocketAddress createSocketAddress(Map<String, String> properties) { assert properties != null; String host = properties.get("host"); @@ -80,13 +65,30 @@ public class SimpleSocketPlugin extends SocketPlugin { return new InetSocketAddress(host, port); } + @Override + protected void setLocalSocketAddress(SocketAddress s) { + assert started && localProperties != null; + if(!(s instanceof InetSocketAddress)) + throw new IllegalArgumentException(); + InetSocketAddress i = (InetSocketAddress) s; + String host = i.getAddress().getHostAddress(); + String port = String.valueOf(i.getPort()); + // FIXME: Special handling for private IP addresses? + Map<String, String> m = new TreeMap<String, String>(localProperties); + m.put("host", host); + m.put("port", port); + callback.setLocalProperties(m); + } + @Override protected Socket createClientSocket() throws IOException { + assert started; return new Socket(); } @Override protected ServerSocket createServerSocket() throws IOException { + assert started; return new ServerSocket(); } } diff --git a/components/net/sf/briar/plugins/socket/SocketPlugin.java b/components/net/sf/briar/plugins/socket/SocketPlugin.java index ad6560069a..ef693baa72 100644 --- a/components/net/sf/briar/plugins/socket/SocketPlugin.java +++ b/components/net/sf/briar/plugins/socket/SocketPlugin.java @@ -18,6 +18,7 @@ import net.sf.briar.plugins.AbstractPlugin; abstract class SocketPlugin extends AbstractPlugin implements StreamTransportPlugin { + // These fields should be accessed with this's lock held protected StreamTransportCallback callback = null; protected ServerSocket socket = null; @@ -135,7 +136,7 @@ implements StreamTransportPlugin { public synchronized void poll() { if(!shouldPoll()) throw new UnsupportedOperationException(); - if(!started) throw new IllegalStateException(); + if(!started) return; for(ContactId c : remoteProperties.keySet()) { executor.execute(createConnector(c)); } @@ -177,6 +178,9 @@ implements StreamTransportPlugin { } public StreamTransportConnection createConnection(ContactId c) { - return started ? createAndConnectSocket(c) : null; + synchronized(this) { + if(!started) return null; + } + return createAndConnectSocket(c); } } -- GitLab