summaryrefslogtreecommitdiff
path: root/src/metrics
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-04-19 17:50:07 +0800
committerchenzizhan <[email protected]>2024-04-19 17:50:07 +0800
commit73d8bbead87ba04e0762831b7e402ae0833de38d (patch)
tree11d85e3fd7d180eccff1982559a79bf046dcaff9 /src/metrics
parentba621ef1c677e1a5ad6ffab6dcd4d771916cd27e (diff)
safe add
Diffstat (limited to 'src/metrics')
-rw-r--r--src/metrics/metric.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/metrics/metric.c b/src/metrics/metric.c
index 887102a..95b7200 100644
--- a/src/metrics/metric.c
+++ b/src/metrics/metric.c
@@ -4,6 +4,8 @@
#include <assert.h>
#include <string.h>
#include <stdarg.h>
+#include <limits.h>
+
#include "uthash.h"
#include "histogram_encoder.h"
@@ -711,11 +713,22 @@ struct metric *metric_counter_new(const char *name)
return pthis;
}
+long long safe_add_longlong(long long a, long long b)
+{
+ if (a > 0 && b > LLONG_MAX - a) {
+ return LLONG_MAX;
+ }
+ if (a < 0 && b < LLONG_MIN - a) {
+ return LLONG_MIN;
+ }
+ return a + b;
+}
+
void metric_counter_incrby(struct metric *pthis, int cell_id, long long value)
{
struct metric_measure_data *data = metric_find_or_new_cell(pthis, cell_id);
struct metric_counter_or_gauge *counter = data->counter;
- counter->value += value;
+ counter->value = safe_add_longlong(counter->value, value);
}
int metric_counter_set(struct metric *pthis, int cell_id, long long value)