[ 
https://issues.apache.org/jira/browse/DIRMINA-1014?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Emmanuel Lécharny updated DIRMINA-1014:
---------------------------------------
    Fix Version/s: 2.2.1
                       (was: 2.2.0)

> SocketAcceptor doesn't unbind correctly
> ---------------------------------------
>
>                 Key: DIRMINA-1014
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1014
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.9
>         Environment: Ubuntu 12.04.5 x64
> Oracle JDK 1.6.0_45
> Mina 2.0.9
>            Reporter: Nipun Jawalkar
>            Assignee: Jonathan Valliere
>            Priority: Major
>             Fix For: 2.2.1
>
>
> When the AbstractIoAcceptor binds a socket, it adds an entry to the 
> "boundAddresses" set to keep track of that socket.
> In my case, I am passing a SocketAddress initialized with a specific port, 
> and "null" for host (I want to listen on that port on all interfaces on the 
> the local machine, i.e 0.0.0.0:9999). This InetSocketAddress instance has an 
> Inet4Address in it when created.
> When the Acceptor is given this v4 SocketAddress to bind, it creates a 
> ServerSocketChannel, and then calls 
> ServerSocketChannel.socket().getLocalSocketAddress() to retrieve a 
> SocketAddress. This is the value that is then put in the "boundAddresses" 
> collection.
> The problem is that the ServerSocketChannel.socket().getLocalSocketAddress() 
> returns a SocketAddress with an Inet6Address value in it 
> (0.0.0.0.0.0.0.0:9999), even though the SocketAcceptor.bind() was given a v4 
> address. So when I try to unbind that socket (using the same v4 address I 
> used to do the bind() call), it fails because the "boundAddresses" set has 
> the v6 version in it, and "Inet6Address.equals(Inet4Address) is false".
> Basically:
> 1. I call NioSocketAcceptor.bind() on a v4 SocketAddress
> 2. A ServerSocketChannel is created for that v4 address.
> 3. The ServerSocketChannel.socket().getLocalSocketAddress() is called, which 
> returns a v6 SocketAddress (which is the equivalent of the v4 SocketAddress 
> given)
> 4. NioSocketAcceptor puts the v6 address in its "boundAddresses" list.
> 5. When I ask to unbind the same v4 address, it fails because the 
> "boundAddresses" list only contains a v6 address.
> Suggested Fix:
> 1. Make the "boundAddresses" field a Map<SocketAddress,SocketAddress>. The 
> keys should be the SocketAddress parameter passed to the bind() call, the 
> values should be the ServerSocketChannel.socket().getLocalSocketAddress().
> 2. When unbind(a) is called, check "boundAddresses.hasKey(a)", and if true, 
> then unbind "boundAddresses.get(a)".
> This makes it consistent for the client; they can use the same instance of 
> SocketAddress to bind and unbind reliably.
> This will match Mina v1.x version, where the SocketAddress passed to the 
> bind() method could be used to also unbind.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to