diff --git a/components/net/sf/briar/plugins/socket/LanSocketPlugin.java b/components/net/sf/briar/plugins/socket/LanSocketPlugin.java index 86b35b206e9775be3aff3352f04f09af279d0ffc..cef55929517adaf09999b8691ba891c657e4ddba 100644 --- a/components/net/sf/briar/plugins/socket/LanSocketPlugin.java +++ b/components/net/sf/briar/plugins/socket/LanSocketPlugin.java @@ -42,13 +42,22 @@ public class LanSocketPlugin extends SimpleSocketPlugin { // Calculate the group address and port from the invitation code InetSocketAddress mcast = convertInvitationCodeToMulticastGroup(code); // Bind a multicast socket for receiving packets - MulticastSocket ms; + MulticastSocket ms = null; try { ms = new MulticastSocket(mcast.getPort()); ms.setInterface(chooseInterface()); ms.joinGroup(mcast.getAddress()); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + if(ms != null) { + try { + ms.leaveGroup(mcast.getAddress()); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } + ms.close(); + } return null; } // Listen until a valid packet is received or the timeout occurs @@ -69,7 +78,6 @@ public class LanSocketPlugin extends SimpleSocketPlugin { try { // Connect back on the advertised TCP port Socket s = new Socket(packet.getAddress(), port); - // Close the multicast socket ms.leaveGroup(mcast.getAddress()); ms.close(); return new SocketTransportConnection(s); @@ -83,8 +91,16 @@ public class LanSocketPlugin extends SimpleSocketPlugin { } now = System.currentTimeMillis(); } + if(LOG.isLoggable(Level.INFO)) + LOG.info("Timeout while sending invitation"); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + try { + ms.leaveGroup(mcast.getAddress()); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) LOG.warning(e1.getMessage()); + } + ms.close(); } return null; } @@ -125,8 +141,11 @@ public class LanSocketPlugin extends SimpleSocketPlugin { if(iface.supportsMulticast()) { Enumeration<InetAddress> addrs = iface.getInetAddresses(); for(InetAddress addr : Collections.list(addrs)) { - if(addr.isLinkLocalAddress() || addr.isSiteLocalAddress()) + if(addr.isLinkLocalAddress() || addr.isSiteLocalAddress()) { + if(LOG.isLoggable(Level.INFO)) + LOG.info("Binding to " + addr.getHostAddress()); return addr; + } } } } @@ -144,21 +163,36 @@ public class LanSocketPlugin extends SimpleSocketPlugin { // Calculate the group address and port from the invitation code InetSocketAddress mcast = convertInvitationCodeToMulticastGroup(code); // Bind a TCP socket for receiving connections - ServerSocket ss; + ServerSocket ss = null; try { ss = new ServerSocket(); ss.bind(new InetSocketAddress(chooseInterface(), 0)); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + if(ss != null) { + try { + ss.close(); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } + } return null; } // Bind a multicast socket for sending packets - MulticastSocket ms; + MulticastSocket ms = null; try { ms = new MulticastSocket(); ms.setInterface(chooseInterface()); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + if(ms != null) ms.close(); + try { + ss.close(); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } return null; } // Send packets until a connection is received or the timeout expires @@ -178,7 +212,8 @@ public class LanSocketPlugin extends SimpleSocketPlugin { ss.setSoTimeout(wait < 1 ? 1 : wait); return new SocketTransportConnection(ss.accept()); } catch(SocketTimeoutException e) { - if(System.currentTimeMillis() < end) { + now = System.currentTimeMillis(); + if(now < end) { ms.send(packet); now = System.currentTimeMillis(); nextPacket = now + interval; @@ -186,8 +221,18 @@ public class LanSocketPlugin extends SimpleSocketPlugin { } } } + if(LOG.isLoggable(Level.INFO)) + LOG.info("Timeout while accepting invitation"); } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + } finally { + ms.close(); + try { + ss.close(); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } } return null; } diff --git a/components/net/sf/briar/plugins/socket/SocketPlugin.java b/components/net/sf/briar/plugins/socket/SocketPlugin.java index 9c9fe08698484e51cd03cb976298651d87bf0212..ae20ba4cca4aa93ae652b4dc26eaa8d089a0c6d9 100644 --- a/components/net/sf/briar/plugins/socket/SocketPlugin.java +++ b/components/net/sf/briar/plugins/socket/SocketPlugin.java @@ -54,14 +54,14 @@ abstract class SocketPlugin extends AbstractPlugin implements StreamPlugin { private void bind() { SocketAddress addr; - ServerSocket ss; + ServerSocket ss = null; try { synchronized(this) { if(!started) return; addr = getLocalSocketAddress(); ss = createServerSocket(); + if(addr == null || ss == null) return; } - if(addr == null || ss == null) return; ss.bind(addr); if(LOG.isLoggable(Level.INFO)) { LOG.info("Bound to " + ss.getInetAddress().getHostAddress() + @@ -69,6 +69,14 @@ abstract class SocketPlugin extends AbstractPlugin implements StreamPlugin { } } catch(IOException e) { if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.getMessage()); + if(ss != null) { + try { + ss.close(); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } + } return; } synchronized(this) { @@ -109,6 +117,12 @@ abstract class SocketPlugin extends AbstractPlugin implements StreamPlugin { } catch(IOException e) { // This is expected when the socket is closed if(LOG.isLoggable(Level.INFO)) LOG.info(e.getMessage()); + try { + ss.close(); + } catch(IOException e1) { + if(LOG.isLoggable(Level.WARNING)) + LOG.warning(e1.getMessage()); + } return; } SocketTransportConnection conn = new SocketTransportConnection(s); @@ -152,10 +166,11 @@ abstract class SocketPlugin extends AbstractPlugin implements StreamPlugin { if(!started) return null; addr = getRemoteSocketAddress(c); s = createClientSocket(); + if(addr == null || s == null) return null; } - if(addr == null || s == null) return null; s.connect(addr); } catch(IOException e) { + if(LOG.isLoggable(Level.INFO)) LOG.info(e.getMessage()); return null; } return new SocketTransportConnection(s);