Hi Emmanuel,

not the gathering of the data is stopped. Instead (already successful) the 
processed data
is repeatedly  process again by my implementation of

class XXX extends MessageDecoderAdapter implements MessageDecoder {
…
public MessageDecoderResult decodable( final IoSession session,final IoBuffer 
buffer ) {
                                try {
                                                final int index = 
CONTENT_LENGTH_HEADER.length();
                                                if( buffer.remaining() < index )
                                                                return 
MessageDecoderResult.NEED_DATA;

                                                final CharsetDecoder 
UTF_DECODER = StandardCharsets.UTF_8.newDecoder();
                                                if( 
!CONTENT_LENGTH_HEADER.equals( buffer.getString( index,UTF_DECODER ) ) )
                                                                return 
MessageDecoderResult.NOT_OK;

                                                final StringBuilder 
contentLengthStr = new StringBuilder();
                                                while( buffer.remaining() > 0 ) 
{
                                                                final byte 
digit = buffer.get();
                                                                if( digit == LF 
)
                                                                                
break;
                                                                
contentLengthStr.append( (char)digit );
                                                }

                                                if( buffer.get() != LF )
                                                                return 
MessageDecoderResult.NEED_DATA;

                                                final int contentLength = 
Integer.parseInt( contentLengthStr.toString().trim() );

                                                if( buffer.remaining() < 
contentLength )
                                                                return 
MessageDecoderResult.NEED_DATA;

                                                if( !decodeableXML( 
session,buffer.getString( contentLength,UTF_DECODER ) ) )
                                                                return 
MessageDecoderResult.NOT_OK;

                                                return MessageDecoderResult.OK;
                                }
                                catch( final BufferUnderflowException buf ) {
                                                buffer.reset();

                                                return 
MessageDecoderResult.NEED_DATA;
                                }
                                catch( final CharacterCodingException cce ) {
                                                throw new RuntimeException( 
cce.getMessage(),cce );
                                }
}
...
}

(Sorry I cannot post the whole code, but the code is more than 5 years old and 
reliably working in production
environments.)

Thus I don’t use a limiter directly, it has a header the bytes is send of the 
payload.

HTH

Max

From: Emmanuel Lecharny <[email protected]>
Date: Thursday, 24. July 2025 at 10:27
To: [email protected] <[email protected]>
Subject: Re: Possible bug in CumulativeProtocolDecoder
Hi Max,


if I understand correctly,n the message that the Handler receives may
contain more than one protocol message (m3 m4), as if the gathering of
data is not stopped?

I'll try to check the code, there may be something fishy...

Could you tell which limiter you use?

On 21/07/2025 11:20, Max Larsson wrote:
> Hi everyone,
>
> especially to Emmanuel for driving mina forward.
>
> I think I found a bug in mina core 2.1.10 in 2.1.9 I cannot reproduce it.
> It has to do with CumulativeProtocolDecoder class and I think it was 
> introduced with the following patch:
> https://github.com/apache/mina/commit/88cb55397c414c6d09ce2d085ce912ab4bf45bf3
>
> The bug isn’t easily reproducible, so I will first describe how the bug 
> expresses. Best to describe is
> A simple visualization. We have real messages t1 to tx which are really send 
> via a TCP/IP connection
> And we have decoded message m1 to mx, which appears finally in the 
> messageReceived method
> Of my IOHandler. During the communication the following happens “out of the 
> blue”:
>
> t1 ->  m1
> t2 -> m2
> t3 -> m3
> t4 -> m3 m4
> t5 -> m3 m4 m5
> …..
>
> I don’t know if it ever “resets” itself, because my business logic is getting 
> panic at t4.
>
> The prerequisite for triggering this behaviour is that the MessageDecoder 
> returns a NEED_DATA,
> but it isn’t always the case that a NEED_DATA triggers the behaviour.
>
> Now comes my observations:
>
>
>    *   The NEED_DATA converts the IoBuffer used into a session buffer
>    *   It copies un the unprocessed data into the session buffer
>    *   Waits for more data to received
>    *   No if new data arrives it is appended to the session buffer
>    *   The message encoder decodes the messages return OK
>    *   There aren’t any remaining bytes in the session buffer
>    *   Lets assume position in the session buffer is 256
>    *   Now the session buffer gets “freed”
>    *   If now new data arrives it is appended to the session buffer
>    *   Than flip gest called on the session buffer
>
> That sets the position of the buffer to 0, at that position is still
>
> The data from the previous successful decoded data.
>
>
>
> To “fix” it the position should either be set  to 256 or the “freed”
>
> Operation should really discard the successful decoded data.
>
>
>
> HTH and is understandable. In doubt ask me.
>
>
>
> Kind regards
>
>
>
> Max
>
>
>
>
>
> Mit freundlichen Grüßen
> Best regards
>
> Dipl.-Inform. Max Larsson
> Geschäftsleitung
>
> ________________________________
> [https://facilityboss.biz/themes/gavias_tico/facilitybossCCS.png]<https://apps.apple.com/us/app/capture-codes-scanner/id6503239357<https://facilityboss.biz/themes/gavias_tico/facilitybossCCS.png%5d%3chttps:/apps.apple.com/us/app/capture-codes-scanner/id6503239357>>
>
> Need to easily scan multiple codes in one go?
> Use our app facilityboss Capture Code Scanner!
>
> Müssen Sie mehrere Codes in einem Durchgang scannen?
> Verwenden Sie unsere App facilityboss Capture Code Scanner.
>
> [Download on the App 
> Store]<https://apps.apple.com/us/app/capture-codes-scanner/id6503239357?itsct=apps_box_badge&itscg=30200>
> ________________________________
> [LinkedIn  - facilityboss]<https://www.linkedin.com/company/facilityboss-gmbh>
> ________________________________
>
> email: [email protected]<mailto:[email protected]>
> web: https://facilityboss.biz
>
> [facilityboss]<https://facilityboss.biz>
>
> Bad Nauheimer Str. 4
> 64289 Darmstadt
> Germany
>
> Sitz der Gesellschaft: Darmstadt
> Registergericht: Amtsgericht Darmstadt, HRB 86193
> Geschäftsführer: Dipl.-Inform Max Lars Robert Larsson
>
> ________________________________
>
> Diese E-Mail enthält unter Umständen vertrauliche und/oder rechtlich 
> geschützte Informationen, die allein für den Adressaten bestimmt sind. Wenn 
> Sie nicht der zutreffende Adressat sind oder diese E-Mail irrtümlich erhalten 
> haben, ist jede Verwendung, Verbreitung, Kopie oder Bezugnahme auf den Inhalt 
> dieser E-Mail verboten. Bitte informieren Sie uns über einen eventuellen 
> Irrtum per Telefon, per Telefax oder E-Mail.
>
> This e-mail may contain confidential and/or privileged information. If you 
> are not the intended recipient, any disclosure, copying, distribution or 
> reference on the contents of this e-mail is strictly prohibited. If you have 
> received this e-mail in error please notify us by e-mail, facsimile or phone 
> call.
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Mit freundlichen Grüßen
Best regards

Dipl.-Inform. Max Larsson
Geschäftsleitung

________________________________
[https://facilityboss.biz/themes/gavias_tico/facilitybossCCS.png]<https://apps.apple.com/us/app/capture-codes-scanner/id6503239357>

Need to easily scan multiple codes in one go?
Use our app facilityboss Capture Code Scanner!

Müssen Sie mehrere Codes in einem Durchgang scannen?
Verwenden Sie unsere App facilityboss Capture Code Scanner.

[Download on the App 
Store]<https://apps.apple.com/us/app/capture-codes-scanner/id6503239357?itsct=apps_box_badge&itscg=30200>
________________________________
[LinkedIn  - facilityboss]<https://www.linkedin.com/company/facilityboss-gmbh>
________________________________

email: [email protected]<mailto:[email protected]>
web: https://facilityboss.biz

[facilityboss]<https://facilityboss.biz>

Bad Nauheimer Str. 4
64289 Darmstadt
Germany

Sitz der Gesellschaft: Darmstadt
Registergericht: Amtsgericht Darmstadt, HRB 86193
Geschäftsführer: Dipl.-Inform Max Lars Robert Larsson

________________________________

Diese E-Mail enthält unter Umständen vertrauliche und/oder rechtlich geschützte 
Informationen, die allein für den Adressaten bestimmt sind. Wenn Sie nicht der 
zutreffende Adressat sind oder diese E-Mail irrtümlich erhalten haben, ist jede 
Verwendung, Verbreitung, Kopie oder Bezugnahme auf den Inhalt dieser E-Mail 
verboten. Bitte informieren Sie uns über einen eventuellen Irrtum per Telefon, 
per Telefax oder E-Mail.

This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient, any disclosure, copying, distribution or reference 
on the contents of this e-mail is strictly prohibited. If you have received 
this e-mail in error please notify us by e-mail, facsimile or phone call.

Reply via email to