Dear Mina Developer,
We are using Mina(1.1.8) and Openfire for our project. Recently with heavy load
to the server, we got following exception in server side:
java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:236)
at
org.apache.mina.filter.support.SSLHandler.messageReceived(SSLHandler.java:313)
at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:392)
at
org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
at
org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
at
org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
at
org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:499)
at
org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
at
org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:293)
at
org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:228)
at
org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:198)
at
org.apache.mina.transport.socket.nio.SocketIoProcessor.access$400(SocketIoProcessor.java:45)
at
org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:485)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
>
When I checked the source code, I think it is a bug.
Here is the source code of 1.1.7/1.18,
if (isInboundDone()) {
// Rewind the MINA buffer if not all data is processed and inbound
is finished.
buf.position(buf.position() - inNetBuffer.position());
inNetBuffer.clear();
}
This means sometimes buf.position() - inNetBuffer.position() can be negative,
then the correct code should be:
if (isInboundDone()) {
// Rewind the MINA buffer if not all data is processed and inbound
is finished.
if (inNetBuffer.position() <= buf.position()) {
buf.position(buf.position() - inNetBuffer.position());
}
inNetBuffer.clear();
}
Please confirm!
Thanks a lot!
James