From 298236de9a1cfbbc2947179ad8dde6d17a30d7aa Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 17 Jun 2024 18:09:59 +0900 Subject: [PATCH 1/4] metrics: Allocate metrics' titles dynamically However, still aded limitations over 1024 characters to prevent a waste of memory consumptions for title names. Signed-off-by: Hiroshi Hatake --- include/fluent-bit/flb_metrics.h | 7 +++++-- src/flb_metrics.c | 34 ++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/include/fluent-bit/flb_metrics.h b/include/fluent-bit/flb_metrics.h index 25b0443224c..1aa0676f90d 100644 --- a/include/fluent-bit/flb_metrics.h +++ b/include/fluent-bit/flb_metrics.h @@ -56,17 +56,20 @@ #define FLB_METRIC_OUT_DROPPED_RECORDS 15 /* dropped_records_total */ #define FLB_METRIC_OUT_RETRIED_RECORDS 16 /* retried_records_total */ +/* The limitation of title name length */ +#define FLB_METRIC_LENGTH_LIMIT 1024 + struct flb_metric { int id; int title_len; - char title[64]; + char *title; size_t val; struct mk_list _head; }; struct flb_metrics { int title_len; /* Title string length */ - char title[64]; /* Title or id for this metrics context */ + char *title; /* Title or id for this metrics context */ int count; /* Total count of metrics registered */ struct mk_list list; /* Head of metrics list */ }; diff --git a/src/flb_metrics.c b/src/flb_metrics.c index 5ac4e6af2d2..7f4e71d49db 100644 --- a/src/flb_metrics.c +++ b/src/flb_metrics.c @@ -78,6 +78,8 @@ struct flb_metrics *flb_metrics_create(const char *title) { int ret; struct flb_metrics *metrics; + size_t title_len = strlen(title); + char *allocated_title = NULL; /* Create a metrics parent context */ metrics = flb_malloc(sizeof(struct flb_metrics)); @@ -87,9 +89,17 @@ struct flb_metrics *flb_metrics_create(const char *title) } metrics->count = 0; + allocated_title = flb_calloc(title_len + 1, sizeof(char)); + if (allocated_title == NULL) { + flb_free(metrics); + return NULL; + } + metrics->title = allocated_title; + /* Set metrics title */ ret = flb_metrics_title(title, metrics); if (ret == -1) { + flb_free(metrics->title); flb_free(metrics); return NULL; } @@ -109,7 +119,7 @@ int flb_metrics_title(const char *title, struct flb_metrics *metrics) flb_errno(); return -1; } - else if (ret >= size){ + else if (ret >= size) { flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); } metrics->title_len = strlen(metrics->title); @@ -121,6 +131,7 @@ int flb_metrics_add(int id, const char *title, struct flb_metrics *metrics) int ret; struct flb_metric *m; size_t size; + size_t threshold = FLB_METRIC_LENGTH_LIMIT; /* Create context */ m = flb_malloc(sizeof(struct flb_metric)); @@ -129,19 +140,27 @@ int flb_metrics_add(int id, const char *title, struct flb_metrics *metrics) return -1; } m->val = 0; - size = sizeof(m->title) - 1; + size = strlen(title); + + if (size > threshold) { + size = threshold; + flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); + } + + m->title = flb_calloc(size + 1, sizeof(char)); + if (m->title == NULL) { + flb_free(m); + return -1; + } /* Write title */ ret = snprintf(m->title, size, "%s", title); if (ret == -1) { flb_errno(); + flb_free(m->title); flb_free(m); return -1; } - else if (ret >= size) { - flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); - } - m->title_len = strlen(m->title); /* Assign an ID */ @@ -150,6 +169,7 @@ int flb_metrics_add(int id, const char *title, struct flb_metrics *metrics) if (id_exists(id, metrics) == FLB_TRUE) { flb_error("[metrics] id=%i already exists for metric '%s'", id, metrics->title); + flb_free(m->title); flb_free(m); return -1; } @@ -189,10 +209,12 @@ int flb_metrics_destroy(struct flb_metrics *metrics) mk_list_foreach_safe(head, tmp, &metrics->list) { m = mk_list_entry(head, struct flb_metric, _head); mk_list_del(&m->_head); + flb_free(m->title); flb_free(m); count++; } + flb_free(metrics->title); flb_free(metrics); return count; } From f6b428766074fac5a3ef515dba2e0b0c71fc9658 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 18 Jun 2024 01:34:23 +0900 Subject: [PATCH 2/4] metrics: windows: Fix failures Signed-off-by: Hiroshi Hatake --- src/flb_metrics.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/flb_metrics.c b/src/flb_metrics.c index 7f4e71d49db..33b21a2cb78 100644 --- a/src/flb_metrics.c +++ b/src/flb_metrics.c @@ -78,7 +78,7 @@ struct flb_metrics *flb_metrics_create(const char *title) { int ret; struct flb_metrics *metrics; - size_t title_len = strlen(title); + size_t title_len = 0; char *allocated_title = NULL; /* Create a metrics parent context */ @@ -89,12 +89,14 @@ struct flb_metrics *flb_metrics_create(const char *title) } metrics->count = 0; - allocated_title = flb_calloc(title_len + 1, sizeof(char)); + title_len = snprintf(NULL, 0, "%s\n", title); + allocated_title = flb_calloc(title_len, sizeof(char)); if (allocated_title == NULL) { flb_free(metrics); return NULL; } metrics->title = allocated_title; + metrics->title[title_len] = '\0'; /* Set metrics title */ ret = flb_metrics_title(title, metrics); @@ -112,14 +114,14 @@ struct flb_metrics *flb_metrics_create(const char *title) int flb_metrics_title(const char *title, struct flb_metrics *metrics) { int ret; - size_t size = sizeof(metrics->title) - 1; + size_t size = sizeof(metrics->title); ret = snprintf(metrics->title, size, "%s", title); if (ret == -1) { flb_errno(); return -1; } - else if (ret >= size) { + else if (ret > size) { flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); } metrics->title_len = strlen(metrics->title); From a84fdb81d0fc049009bbd914b3eaa740e26e9d1b Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 18 Jun 2024 09:40:07 +0900 Subject: [PATCH 3/4] metrics: Fix size error Signed-off-by: Hiroshi Hatake --- src/flb_metrics.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/flb_metrics.c b/src/flb_metrics.c index 33b21a2cb78..c526c616742 100644 --- a/src/flb_metrics.c +++ b/src/flb_metrics.c @@ -89,14 +89,13 @@ struct flb_metrics *flb_metrics_create(const char *title) } metrics->count = 0; - title_len = snprintf(NULL, 0, "%s\n", title); - allocated_title = flb_calloc(title_len, sizeof(char)); + title_len = snprintf(NULL, 0, "%s", title); + allocated_title = flb_calloc(title_len + 1, sizeof(char)); if (allocated_title == NULL) { flb_free(metrics); return NULL; } metrics->title = allocated_title; - metrics->title[title_len] = '\0'; /* Set metrics title */ ret = flb_metrics_title(title, metrics); @@ -114,7 +113,7 @@ struct flb_metrics *flb_metrics_create(const char *title) int flb_metrics_title(const char *title, struct flb_metrics *metrics) { int ret; - size_t size = sizeof(metrics->title); + size_t size = snprintf(NULL, 0, "%s", title); ret = snprintf(metrics->title, size, "%s", title); if (ret == -1) { From a4da7be0f279bf33bf317dea7822e3d434107c6f Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 18 Jun 2024 10:19:04 +0900 Subject: [PATCH 4/4] metrics: Handle limit of title length Signed-off-by: Hiroshi Hatake --- src/flb_metrics.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/flb_metrics.c b/src/flb_metrics.c index c526c616742..5b50b138c39 100644 --- a/src/flb_metrics.c +++ b/src/flb_metrics.c @@ -80,6 +80,7 @@ struct flb_metrics *flb_metrics_create(const char *title) struct flb_metrics *metrics; size_t title_len = 0; char *allocated_title = NULL; + size_t threshold = FLB_METRIC_LENGTH_LIMIT; /* Create a metrics parent context */ metrics = flb_malloc(sizeof(struct flb_metrics)); @@ -90,6 +91,12 @@ struct flb_metrics *flb_metrics_create(const char *title) metrics->count = 0; title_len = snprintf(NULL, 0, "%s", title); + + if (title_len > threshold) { + title_len = threshold; + flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); + } + allocated_title = flb_calloc(title_len + 1, sizeof(char)); if (allocated_title == NULL) { flb_free(metrics); @@ -120,9 +127,7 @@ int flb_metrics_title(const char *title, struct flb_metrics *metrics) flb_errno(); return -1; } - else if (ret > size) { - flb_warn("[%s] title '%s' was truncated", __FUNCTION__, title); - } + metrics->title_len = strlen(metrics->title); return 0; }