From e1cdb05e15c989b2c9e4a7c4ab2189646b7e176b Mon Sep 17 00:00:00 2001 From: Kevin Herron Date: Wed, 27 Nov 2024 05:42:52 -0800 Subject: [PATCH] Allow sequenceNumber to wrap from UInt32.MAX to 0 fixes #1346 --- .../eclipse/milo/opcua/stack/core/channel/ChunkDecoder.java | 2 +- .../milo/opcua/stack/core/channel/ChunkDecoderTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoder.java b/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoder.java index 12da90599b..19d3177ddc 100644 --- a/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoder.java +++ b/opc-ua-stack/stack-core/src/main/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoder.java @@ -537,7 +537,7 @@ static boolean validateSequenceNumber(long lastSequenceNumber, long sequenceNumb return sequenceNumber < 1024 || sequenceNumber == lastSequenceNumber + 1; } else if (lastSequenceNumber == UInteger.MAX_VALUE) { // must wrap at this point - return sequenceNumber > 0 && sequenceNumber < 1024; + return sequenceNumber >= 0 && sequenceNumber < 1024; } else { return sequenceNumber == lastSequenceNumber + 1; } diff --git a/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoderTest.java b/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoderTest.java index d7fc05cab6..e52bc9c623 100644 --- a/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoderTest.java +++ b/opc-ua-stack/stack-core/src/test/java/org/eclipse/milo/opcua/stack/core/channel/ChunkDecoderTest.java @@ -32,6 +32,11 @@ void validateSequenceNumbers() { assertTrue(validateSequenceNumber(UInteger.MAX_VALUE - 1024, i)); } + // wrapping around to anything < 1024 is allowed, from UInteger.MAX_VALUE + for (int i = 0; i < 1024; i++) { + assertTrue(validateSequenceNumber(UInteger.MAX_VALUE, i)); + } + // wrapping around to >= 1024 is not allowed for (int i = 1024; i < 2048; i++) { assertFalse(validateSequenceNumber(UInteger.MAX_VALUE - 1024, i));