Emmanuel Lecharny created DIRMINA-1029:
------------------------------------------
Summary: The sent buffer is reset to its original position when
using the SSL Filter after a session.write()
Key: DIRMINA-1029
URL: https://issues.apache.org/jira/browse/DIRMINA-1029
Project: MINA
Issue Type: Bug
Affects Versions: 2.0.13
Reporter: Emmanuel Lecharny
Fix For: 2.0.14
Last night, I played around one of our test, adding a {{SSL}} version of it.
It's basically a {{TcpServer}} and a {{TcpCLient}}, which sends a message N
times.
The TCP version uses a buffer :
{noformat}
/** The buffer containing the message to send */
private IoBuffer buffer = IoBuffer.allocate(8);
{noformat}
The main class contains (with commented the Buffer content) :
{noformat}
// HeapBuffer[pos=0 lim=8 cap=8: 00 00 00 00 00 00 00 00]
client.buffer.putLong(client.counter.getCount());
// HeapBuffer[pos=8 lim=8 cap=8: empty]
client.buffer.flip();
// HeapBuffer[pos=0 lim=8 cap=8: 00 00 00 00 00 01 86 A0]
session.write(client.buffer);
// HeapBuffer[pos=8 lim=8 cap=8: empty]
{noformat}
The same code, when ran on a SSL connection :
{noformat}
// HeapBuffer[pos=0 lim=8 cap=8: 00 00 00 00 00 00 00 00]
client.buffer.putLong(client.counter.getCount());
// HeapBuffer[pos=8 lim=8 cap=8: empty]
client.buffer.flip();
// HeapBuffer[pos=0 lim=8 cap=8: 00 00 00 00 00 01 86 A0]
session.write(client.buffer);
//HeapBuffer[pos=0 lim=8 cap=8: 00 00 00 00 00 01 86 A0]
{noformat}
As you can see, in one case, the buffer is reset ({(SSL}}) while it is consumed
on the other side(non {{SSL}}).
It seems to be a clear bug, because we would expect the buffer to have the same
value in both case, and I would expect the {{SSL}} use case to behave as the
{{non-SSL}} use case.
The fact is that the {{SSLFilter.filterWrite()}} method does :
{noformat}
...
} else if (sslHandler.isHandshakeComplete()) {
// SSL encrypt
int pos = buf.position();
sslHandler.encrypt(buf.buf());
buf.position(pos); <--------------------
Wrong !
...
{noformat}
This buffer reset has been done a very long time ago (10 years and 9 months) to
fix a problem :
http://svn.apache.org/viewvc/directory/network/branches/api_integration/src/java/org/apache/mina/filter/SSLFilter.java?r1=169302&r2=169301&pathrev=169302
IMO, the fix is just plain wrong. What should be done is to send back the
original buffer which is always in the {{WriteRequest}} to the {{IoHandler}}.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)