From 4f8afc535e77070f1ef00434674f0417c6f9ef69 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 28 Jul 2021 16:19:56 -0400 Subject: [PATCH] Truncate aggregation sum to fit map bitness Signed-off-by: Mathieu Desnoyers Change-Id: I89a77d9df897f2b1cc7bfc62dcc9e12f31e4a12b --- src/common/counter/counter.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/common/counter/counter.c b/src/common/counter/counter.c index 99a46af6..4f2ac4c8 100644 --- a/src/common/counter/counter.c +++ b/src/common/counter/counter.c @@ -453,6 +453,35 @@ int lttng_counter_aggregate(const struct lib_counter_config *config, default: return -EINVAL; } + switch (config->counter_size) { + case COUNTER_SIZE_8_BIT: + if (sum > INT8_MAX) + *overflow = true; + if (sum < INT8_MIN) + *underflow = true; + sum = (int8_t) sum; /* Truncate sum. */ + break; + case COUNTER_SIZE_16_BIT: + if (sum > INT16_MAX) + *overflow = true; + if (sum < INT16_MIN) + *underflow = true; + sum = (int16_t) sum; /* Truncate sum. */ + break; + case COUNTER_SIZE_32_BIT: + if (sum > INT32_MAX) + *overflow = true; + if (sum < INT32_MIN) + *underflow = true; + sum = (int32_t) sum; /* Truncate sum. */ + break; +#if CAA_BITS_PER_LONG == 64 + case COUNTER_SIZE_64_BIT: + break; +#endif + default: + return -EINVAL; + } *value = sum; return 0; } -- 2.34.1