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

Andrea Cosentino resolved CAMEL-26481.
--------------------------------------
    Resolution: Fixed

> camel-syslog: Rfc5425FrameDecoder should handle fragmented length fields
> ------------------------------------------------------------------------
>
>                 Key: CAMEL-26481
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26481
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-syslog
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Major
>             Fix For: 4.18.6, 4.22.3, 4.24.0
>
>
> h3. Current behaviour
> In {{camel-syslog}}, {{Rfc5425FrameDecoder}} decodes octet-counting frames 
> over Netty TCP connections.
> When incoming bytes end inside a length field before the space delimiter (for 
> instance when a TCP segment ends after frame content and contains only 
> initial digits of the next frame length):
> * {{indexOf(in, ' ')}} returns {{-1}}.
> * {{lengthbuffer}} remains empty, causing {{Integer.parseInt("")}} to throw a 
> {{NumberFormatException}}.
> * The decoder catches the exception and executes {{in.resetReaderIndex()}}.
> Because {{in.markReaderIndex()}} is not set after completing earlier frames, 
> {{in.resetReaderIndex()}} rewinds {{readerIndex}} back to index 0 of the 
> Netty cumulation buffer, causing the decoder to re-process and re-emit 
> previously decoded frames repeatedly.
> Additionally, {{in.readBytes(index)}} allocates a buffer that is not released.
> h3. Expected behaviour
> {{Rfc5425FrameDecoder}} should verify that the space delimiter has arrived 
> before parsing the length field. If the delimiter has not arrived yet, it 
> should wait for additional data without modifying or resetting the reader 
> index. It should also read the length value without allocating unreleased 
> buffers.
> h3. Change
> * In {{Rfc5425FrameDecoder.decode}}:
>   - Check if the space delimiter is present before parsing the length field; 
> if absent, return immediately without altering {{readerIndex}}.
>   - Parse length digits directly from the buffer without allocating 
> unreleased {{ByteBuf}} instances.
>   - Advance {{readerIndex}} past the length and delimiter once confirmed.
> * Add unit tests in {{camel-syslog}} verifying that fragmented streams ending 
> within length fields decode frames correctly in sequence.
> h3. Tests
> * Unit test in {{components/camel-syslog}} using {{EmbeddedChannel}} 
> verifying sequential decoding across fragmented stream chunks.
> * Ensure all existing tests in {{camel-syslog}} continue to pass.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to