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);