Daisuke Kanai created CAMEL-25137:
-------------------------------------

             Summary: ArrayIndexOutOfBoundsException: Index -1 when MLLP 
message starts with segment delimiter
                 Key: CAMEL-25137
                 URL: https://issues.apache.org/jira/browse/CAMEL-25137
             Project: Camel
          Issue Type: Bug
          Components: camel-mllp
            Reporter: Daisuke Kanai


When MllpTcpServerConsumer receives an MLLP payload where the very first byte 
is a segment delimiter (0x0D / \r), populateHl7DataHeaders fails with 
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds.

While a leading segment delimiter represents an invalid/malformed HL7 message, 
the MLLP transport layer should handle malformed payloads gracefully (e.g., 
throwing a controlled MllpException or passing it to downstream error handlers) 
rather than crashing with an unhandled runtime exception.

 
{code:java}
 java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 
889 at 
org.apache.camel.component.mllp.MllpTcpServerConsumer.populateHl7DataHeaders(MllpTcpServerConsumer.java:387)
 at 
org.apache.camel.component.mllp.MllpTcpServerConsumer.processMessage(MllpTcpServerConsumer.java:295)
 at 
org.apache.camel.component.mllp.internal.TcpSocketConsumerRunnable.run(TcpSocketConsumerRunnable.java:167){code}
 

 

In MllpTcpServerConsumer.java (around line 387):
{code:java}
for (int i = 0; i < hl7MessageBytes.length; ++i) {
    if (fieldSeparator == hl7MessageBytes[i]) {
        fieldSeparatorIndexes.add(i);
    } else if (MllpProtocolConstants.SEGMENT_DELIMITER == hl7MessageBytes[i]) {
        // If the MSH Segment doesn't have a trailing field separator, add one 
so the field can be extracted into a header
        if (fieldSeparator != hl7MessageBytes[i - 1]) {
            fieldSeparatorIndexes.add(i);
        }
        endOfMSH = i;
        break;
    }
} {code}
 

When the payload starts with SEGMENT_DELIMITER (\r), the loop enters the 
else-if block at i = 0. Evaluating hl7MessageBytes[i - 1] attempts to access 
hl7MessageBytes[-1], triggering ArrayIndexOutOfBoundsException.

Additionally, hardcoding hl7MessageBytes[3] as the fieldSeparator assumes the 
payload strictly begins with MSH|. If leading garbage/delimiters are present, 
this index misaligns and causes secondary parsing failures.

While a message not starting with 'MSH' is strictly non-compliant with the HL7 
specification, I wanted to share this finding as receiving an unhandled 
java.lang.ArrayIndexOutOfBoundsException seemed like an unintended behavior.



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

Reply via email to