From 791a4e6771b2d47f671b0d4b5bd0eaf2f47c18df Mon Sep 17 00:00:00 2001 From: Nautilus009 Date: Thu, 6 Nov 2025 14:31:45 -0500 Subject: [PATCH] Fix AMQCPP-760 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In ActiveMQ-CPP 3.9.5, several methods in activemq/core/ActiveMQMessageAudit.cpp use subtraction against Integer::MAX_VALUE when normalizing the ProducerSequenceId. When the sequence exceeds 2,147,483,647, the subtraction results in a negative scaled index, which causes the bit array (BitSet) access to throw or behave incorrectly. As a result, messages — especially Advisory messages — are incorrectly marked as duplicates and discarded under failover conditions after long broker uptime. --- .../src/main/activemq/core/ActiveMQMessageAudit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/activemq-cpp/src/main/activemq/core/ActiveMQMessageAudit.cpp b/activemq-cpp/src/main/activemq/core/ActiveMQMessageAudit.cpp index 1755b7ca5..443e5a535 100644 --- a/activemq-cpp/src/main/activemq/core/ActiveMQMessageAudit.cpp +++ b/activemq-cpp/src/main/activemq/core/ActiveMQMessageAudit.cpp @@ -148,7 +148,7 @@ bool ActiveMQMessageAudit::isDuplicate(const std::string& id) const { if (index >= 0) { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } answer = bits->get(scaledIndex); @@ -185,7 +185,7 @@ bool ActiveMQMessageAudit::isDuplicate(decaf::lang::Pointer msgId) co if (index >= 0) { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } answer = bits->get(scaledIndex); @@ -218,7 +218,7 @@ void ActiveMQMessageAudit::rollback(const std::string& msgId) { if (index >= 0) { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } bits->set(scaledIndex, false); @@ -249,7 +249,7 @@ void ActiveMQMessageAudit::rollback(decaf::lang::Pointer ms if (index >= 0) { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } bits->set(scaledIndex, false); @@ -284,7 +284,7 @@ bool ActiveMQMessageAudit::isInOrder(const std::string& msgId) const { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } answer = ((bits->length() - 1) == scaledIndex); @@ -319,7 +319,7 @@ bool ActiveMQMessageAudit::isInOrder(decaf::lang::Pointer m if (index >= 0) { int scaledIndex = (int) index; if (index > Integer::MAX_VALUE) { - scaledIndex = (int)(index - Integer::MAX_VALUE); + scaledIndex = (int)(index % Integer::MAX_VALUE); } answer = ((bits->length() - 1) == scaledIndex); }