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!
