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)