@cryptotaxi247 / netdata-1 / commits / 7bfc54317

Fix memory leaks on Netdata exit (#12511)

* Fix memory leaks in dimensions and charts * Initialize superblock memory regions * Clean up static threads * Fix memory leaks in compression * Fix memory leaks in rrdcaltemplate * Fix memory leaks in health config * Fix ACLK memory leaks

Vladimir Kobal committed Apr 1, 2022 at 15:22 UTC 7bfc543172115ee8c042f605c3af1432c43d1b07
10 files changed +24 -4
aclk/aclk.c
+1
@@ -1105,6 +1105,7 @@ void aclk_send_node_instances()
1105 uuid_unparse_lower(list->node_id, (char*)query->data.node_update.node_id);
1106 query->data.node_update.queryable = 1;
1107 query->data.node_update.session_id = aclk_session_newarch;
1108 + freez(list->hostname);
1109 info("Queuing status update for node=%s, live=%d, hops=%d",(char*)query->data.node_update.node_id,
1110 list->live,
1111 list->hops);
aclk/aclk_util.c
+1
@@ -41,6 +41,7 @@ void aclk_env_t_destroy(aclk_env_t *env) {
41 for (size_t i = 0; i < env->transport_count; i++) {
42 if(env->transports[i]) {
43 aclk_transport_desc_t_destroy(env->transports[i]);
44 + freez(env->transports[i]);
45 env->transports[i] = NULL;
46 }
47 }
daemon/main.c
+2
@@ -250,6 +250,8 @@ void cancel_main_threads() {
250 else
251 info("All threads finished.");
252
253 + for (i = 0; static_threads[i].name != NULL ; i++)
254 + freez(static_threads[i].thread);
255 free(static_threads);
256 }
257
database/engine/datafile.c
+1
@@ -159,6 +159,7 @@ int create_data_file(struct rrdengine_datafile *datafile)
159 if (unlikely(ret)) {
160 fatal("posix_memalign:%s", strerror(ret));
161 }
162 + memset(superblock, 0, sizeof(*superblock));
163 (void) strncpy(superblock->magic_number, RRDENG_DF_MAGIC, RRDENG_MAGIC_SZ);
164 (void) strncpy(superblock->version, RRDENG_DF_VER, RRDENG_VER_SZ);
165 superblock->tier = 1;
database/engine/journalfile.c
+1
@@ -210,6 +210,7 @@ int create_journal_file(struct rrdengine_journalfile *journalfile, struct rrdeng
210 if (unlikely(ret)) {
211 fatal("posix_memalign:%s", strerror(ret));
212 }
213 + memset(superblock, 0, sizeof(*superblock));
214 (void) strncpy(superblock->magic_number, RRDENG_JF_MAGIC, RRDENG_MAGIC_SZ);
215 (void) strncpy(superblock->version, RRDENG_JF_VER, RRDENG_VER_SZ);
216
database/rrdcalctemplate.c
+3
@@ -120,6 +120,9 @@ inline void rrdcalctemplate_free(RRDCALCTEMPLATE *rt) {
120 freez(rt->name);
121 freez(rt->exec);
122 freez(rt->recipient);
123 + freez(rt->classification);
124 + freez(rt->component);
125 + freez(rt->type);
126 freez(rt->context);
127 freez(rt->source);
128 freez(rt->units);
database/rrddim.c
+2
@@ -495,6 +495,7 @@ void rrddim_free_custom(RRDSET *st, RRDDIM *rd, int db_rotated)
495 case RRD_MEMORY_MODE_RAM:
496 debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name);
497 freez((void *)rd->id);
498 + freez((void *)rd->name);
499 freez(rd->cache_filename);
500 freez(rd->state);
501 munmap(rd, rd->memsize);
@@ -505,6 +506,7 @@ void rrddim_free_custom(RRDSET *st, RRDDIM *rd, int db_rotated)
506 case RRD_MEMORY_MODE_DBENGINE:
507 debug(D_RRD_CALLS, "Removing dimension '%s'.", rd->name);
508 freez((void *)rd->id);
509 + freez((void *)rd->name);
510 freez(rd->cache_filename);
511 freez(rd->state);
512 freez(rd);
database/rrdset.c
+7
@@ -395,6 +395,13 @@ void rrdset_free(RRDSET *st) {
395 netdata_rwlock_destroy(&st->state->labels.labels_rwlock);
396
397 // free directly allocated members
398 + freez((void *)st->name);
399 + freez(st->type);
400 + freez(st->family);
401 + freez(st->title);
402 + freez(st->units);
403 + freez(st->context);
404 + freez(st->cache_dir);
405 freez(st->config_section);
406 freez(st->plugin_name);
407 freez(st->module_name);
health/health_config.c
+4 -4
@@ -665,7 +665,6 @@ static int health_readfile(const char *filename, void *data) {
665 if(rc) {
666 if(!alert_hash_and_store_config(rc->config_hash_id, alert_cfg, sql_store_hashes) || ignore_this || !rrdcalc_add_alarm_from_config(host, rc)) {
667 rrdcalc_free(rc);
668 - alert_config_free(alert_cfg);
668 }
669 // health_add_alarms_loop(host, rc, ignore_this) ;
670 }
@@ -673,7 +672,6 @@ static int health_readfile(const char *filename, void *data) {
672 if(rt) {
673 if (!alert_hash_and_store_config(rt->config_hash_id, alert_cfg, sql_store_hashes) || ignore_this || !rrdcalctemplate_add_template_from_config(host, rt)) {
674 rrdcalctemplate_free(rt);
676 - alert_config_free(alert_cfg);
675 }
676 rt = NULL;
677 }
@@ -691,6 +689,8 @@ static int health_readfile(const char *filename, void *data) {
689 rc->old_status = RRDCALC_STATUS_UNINITIALIZED;
690 rc->warn_repeat_every = host->health_default_warn_repeat_every;
691 rc->crit_repeat_every = host->health_default_crit_repeat_every;
692 + if (alert_cfg)
693 + alert_config_free(alert_cfg);
694 alert_cfg = callocz(1, sizeof(struct alert_config));
695
696 if(rrdvar_fix_name(rc->name))
@@ -704,7 +704,6 @@ static int health_readfile(const char *filename, void *data) {
704 // health_add_alarms_loop(host, rc, ignore_this) ;
705 if(!alert_hash_and_store_config(rc->config_hash_id, alert_cfg, sql_store_hashes) || ignore_this || !rrdcalc_add_alarm_from_config(host, rc)) {
706 rrdcalc_free(rc);
707 - alert_config_free(alert_cfg);
707 }
708
709 rc = NULL;
@@ -713,7 +712,6 @@ static int health_readfile(const char *filename, void *data) {
712 if(rt) {
713 if(!alert_hash_and_store_config(rt->config_hash_id, alert_cfg, sql_store_hashes) || ignore_this || !rrdcalctemplate_add_template_from_config(host, rt)) {
714 rrdcalctemplate_free(rt);
716 - alert_config_free(alert_cfg);
715 }
716 }
717
@@ -726,6 +724,8 @@ static int health_readfile(const char *filename, void *data) {
724 rt->delay_multiplier = 1.0;
725 rt->warn_repeat_every = host->health_default_warn_repeat_every;
726 rt->crit_repeat_every = host->health_default_crit_repeat_every;
727 + if (alert_cfg)
728 + alert_config_free(alert_cfg);
729 alert_cfg = callocz(1, sizeof(struct alert_config));
730
731 if(rrdvar_fix_name(rt->name))
streaming/compression.c
+2
@@ -48,6 +48,7 @@ static void lz4_compressor_destroy(struct compressor_state **state)
48 if (s->data->stream)
49 LZ4_freeStream(s->data->stream);
50 freez(s->data->stream_buffer);
51 + freez(s->data);
52 }
53 freez(s->buffer);
54 freez(s);
@@ -156,6 +157,7 @@ static void lz4_decompressor_destroy(struct decompressor_state **state)
157 if (s->data->stream)
158 LZ4_freeStreamDecode(s->data->stream);
159 freez(s->data->stream_buffer);
160 + freez(s->data);
161 }
162 freez(s->buffer);
163 freez(s);