From 960176394398040983cdc0240501a7af8dbc3598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ayd=C4=B1n=20Mercan?= Date: Mon, 11 Dec 2023 13:50:45 +0300 Subject: [PATCH] Use a non-atomic counter when passing to stats dumper (cherry picked from commit bb96142a17a8b65defbc9fcc66679d114cbb2576) --- lib/isc/stats.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/isc/stats.c b/lib/isc/stats.c index 2e3fd3f47f..86d4833042 100644 --- a/lib/isc/stats.c +++ b/lib/isc/stats.c @@ -30,6 +30,16 @@ typedef atomic_int_fast64_t isc__atomic_statcounter_t; +/* + * Statistics are counted with an atomic int_fast64_t but exported to functions + * taking int64_t (isc_stats_dumper_t). A 128-bit native and fast architecture + * doesn't exist in reality so these two are the same thing in practise. + * However, a silent truncation happening silently in the future is still not + * acceptable. + */ +STATIC_ASSERT(sizeof(isc__atomic_statcounter_t) <= sizeof(int64_t), + "Exported statistics must fit into the statistic counter size"); + struct isc_stats { unsigned int magic; isc_mem_t *mctx; @@ -125,7 +135,7 @@ isc_stats_dump(isc_stats_t *stats, isc_stats_dumper_t dump_fn, void *arg, REQUIRE(ISC_STATS_VALID(stats)); for (i = 0; i < stats->ncounters; i++) { - isc__atomic_statcounter_t counter = atomic_load_acquire(&stats->counters[i]); + int_fast64_t counter = atomic_load_acquire(&stats->counters[i]); if ((options & ISC_STATSDUMP_VERBOSE) == 0 && counter == 0) { continue; }