From 32b99023264d68484d91db702b02c45f609c2a29 Mon Sep 17 00:00:00 2001 From: Eric Bowden Date: Fri, 1 May 2026 11:11:40 -0500 Subject: [PATCH] Added some extra sanity checks in CountersManager.Free to match the Java API and prevent corruption if a bogus counter ID was passed in --- src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs | 9 ++++++++- src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs b/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs index f3c9c2a8..73c40cd3 100644 --- a/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs +++ b/src/Adaptive.Agrona/Concurrent/Status/CountersManager.cs @@ -314,9 +314,16 @@ public AtomicCounter NewCounter( /// the counter to freed public void Free(int counterId) { + ValidateCounterId(counterId); int recordOffset = MetaDataOffset(counterId); + if (RECORD_ALLOCATED != MetaDataBuffer.GetIntVolatile(recordOffset)) + { + throw new System.InvalidOperationException("counter not allocated: id=" + counterId); + } + MetaDataBuffer.PutLong(recordOffset + FREE_FOR_REUSE_DEADLINE_OFFSET, _epochClock.Time() + _freeToReuseTimeoutMs); + MetaDataBuffer.SetMemory(recordOffset + KEY_OFFSET, MAX_KEY_LENGTH, 0); MetaDataBuffer.PutIntOrdered(recordOffset, RECORD_RECLAIMED); _freeList.Add(counterId); } @@ -343,7 +350,7 @@ private int NextCounterId() if (nowMs >= deadlineMs) { - _freeList.Remove(i); + _freeList.RemoveAt(i); ValuesBuffer.PutLongOrdered(CounterOffset(counterId), 0L); return counterId; diff --git a/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs b/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs index 97c0a944..c3df6bd9 100644 --- a/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs +++ b/src/Adaptive.Agrona/Concurrent/Status/CountersReader.cs @@ -445,7 +445,7 @@ public string GetCounterLabel(int counterId) return LabelValue(MetaDataOffset(counterId)); } - private void ValidateCounterId(int counterId) + protected void ValidateCounterId(int counterId) { if (counterId < 0 || counterId > MaxCounterId) {