Module: kamailio
Branch: master
Commit: 79f5265057c99a6058bb92a3c0992fa1b9b0c121
URL: 
https://github.com/kamailio/kamailio/commit/79f5265057c99a6058bb92a3c0992fa1b9b0c121

Author: Norm Brandinger <[email protected]>
Committer: Henning Westerholt <[email protected]>
Date: 2026-03-12T11:22:03+01:00

core: fix swapped comparison in atomic_stdatomic.h dec/inc_and_test

atomic_fetch_sub_explicit() returns the value BEFORE the subtraction.
To test whether the result reached zero, dec_and_test must compare the
old value against 1 (old=1, new=1-1=0).  The code compared against -1,
which can never be true for a positive refcount, so the "reached zero"
condition was never triggered.

The symmetric bug existed in inc_and_test: it compared the pre-increment
value against 1 instead of -1.

This affected all 8 _and_test functions (int/long x relaxed/seq_cst).

The practical impact is that any refcount-guarded free (TM transactions,
TCP connections, DNS cache entries, config blocks, WebSocket connections)
never fired on aarch64, causing shared memory to leak monotonically.

Fixes: #4626

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---

Modified: src/core/atomic/atomic_stdatomic.h

---

Diff:  
https://github.com/kamailio/kamailio/commit/79f5265057c99a6058bb92a3c0992fa1b9b0c121.diff
Patch: 
https://github.com/kamailio/kamailio/commit/79f5265057c99a6058bb92a3c0992fa1b9b0c121.patch

---

diff --git a/src/core/atomic/atomic_stdatomic.h 
b/src/core/atomic/atomic_stdatomic.h
index 39e04b2535e..e35dd9ed7fa 100644
--- a/src/core/atomic/atomic_stdatomic.h
+++ b/src/core/atomic/atomic_stdatomic.h
@@ -84,14 +84,14 @@ inline static int atomic_inc_and_test_int(volatile int *var)
 {
        return atomic_fetch_add_explicit(
                                   (_Atomic int *)var, 1, memory_order_relaxed)
-                  == 1;
+                  == -1;
 }
 
 inline static int atomic_dec_and_test_int(volatile int *var)
 {
        return atomic_fetch_sub_explicit(
                                   (_Atomic int *)var, 1, memory_order_relaxed)
-                  == -1;
+                  == 1;
 }
 
 inline static int atomic_get_and_set_int(volatile int *var, int v)
@@ -143,14 +143,14 @@ inline static long atomic_inc_and_test_long(volatile long 
*var)
 {
        return atomic_fetch_add_explicit(
                                   (_Atomic long *)var, 1, memory_order_relaxed)
-                  == 1;
+                  == -1;
 }
 
 inline static long atomic_dec_and_test_long(volatile long *var)
 {
        return atomic_fetch_sub_explicit(
                                   (_Atomic long *)var, 1, memory_order_relaxed)
-                  == -1;
+                  == 1;
 }
 
 inline static long atomic_get_and_set_long(volatile long *var, long v)
@@ -216,14 +216,14 @@ inline static int mb_atomic_inc_and_test_int(volatile int 
*var)
 {
        return atomic_fetch_add_explicit(
                                   (_Atomic int *)var, 1, memory_order_seq_cst)
-                  == 1;
+                  == -1;
 }
 
 inline static int mb_atomic_dec_and_test_int(volatile int *var)
 {
        return atomic_fetch_sub_explicit(
                                   (_Atomic int *)var, 1, memory_order_seq_cst)
-                  == -1;
+                  == 1;
 }
 
 inline static int mb_atomic_get_and_set_int(volatile int *var, int v)
@@ -285,14 +285,14 @@ inline static long mb_atomic_inc_and_test_long(volatile 
long *var)
 {
        return atomic_fetch_add_explicit(
                                   (_Atomic long *)var, 1, memory_order_seq_cst)
-                  == 1;
+                  == -1;
 }
 
 inline static long mb_atomic_dec_and_test_long(volatile long *var)
 {
        return atomic_fetch_sub_explicit(
                                   (_Atomic long *)var, 1, memory_order_seq_cst)
-                  == -1;
+                  == 1;
 }
 
 inline static long mb_atomic_get_and_set_long(volatile long *var, long v)

_______________________________________________
Kamailio - Development Mailing List -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to