NioTcpServer is not thread-safe when unbinding sockets
------------------------------------------------------

                 Key: DIRMINA-869
                 URL: https://issues.apache.org/jira/browse/DIRMINA-869
             Project: MINA
          Issue Type: Bug
          Components: Core
            Reporter: Martin Ellis


The addresses field is a HashSet wrapped using Collections.synchronizedSet.
The modifications to the set in the bind(...) and unbind(...) method, are 
guarded by synchronizing on 'this'.

However, the unbindAll() method iterates over the set, without synchronization. 
 This could lead to a bug if a call to unbindAll() is made while a socket is 
being bind()'ed or unbind()'ed.

>From NioTcpServer:
{noformat}
    private Set<SocketAddress> addresses =
        Collections.synchronizedSet(new HashSet<SocketAddress>());
...
    public void unbindAll() throws IOException {
        for (SocketAddress socketAddress : addresses) {
            unbind(socketAddress);
        }
    }
{noformat}

>From the unsynchronizedSet javadoc.
{noformat}
It is imperative that the user manually synchronize on the returned set when 
iterating over it:

  Set s = Collections.synchronizedSet(new HashSet());
      ...
  synchronized(s) {
      Iterator i = s.iterator(); // Must be in the synchronized block
      while (i.hasNext())
          foo(i.next());
  }

{noformat}

Another fix might be to use a set from java.util.concurrent.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to