From: Anthony Lineham Memory leak when configuration contains duplicate items. Previously, any duplicate items were added to configuration hash table. However, the hash table utility discards duplicates. This was leading to a memory leak during config re-loads if duplicate entries were present. Now, check for duplicates and don't add them to the hash table. --- src/cfg.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+), 0 deletions(-) diff --git a/src/cfg.c b/src/cfg.c index 5dc813d..c9b21d4 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -118,30 +118,89 @@ cfg_bad_hostname_set(GlobalConfig *self, gchar *bad_hostname_re) void cfg_add_source(GlobalConfig *cfg, LogSourceGroup *group) { + LogSourceGroup *dup_group = NULL; + + dup_group = g_hash_table_lookup(cfg->sources, group->name); + if (dup_group) + { + LogPipe *self = (LogPipe *) group; + + msg_error("Duplicate item in configuration file", + evt_tag_str("source", group->name), + NULL); + log_pipe_unref(self); + return; + } g_hash_table_insert(cfg->sources, group->name, group); } void cfg_add_dest(GlobalConfig *cfg, LogDestGroup *group) { + LogDestGroup *dup_group = NULL; + + dup_group = g_hash_table_lookup(cfg->destinations, group->name); + if (dup_group) + { + LogPipe *self = (LogPipe *) group; + + msg_error("Duplicate item in configuration file", + evt_tag_str("destination", group->name), + NULL); + log_pipe_unref(self); + return; + } g_hash_table_insert(cfg->destinations, group->name, group); } void cfg_add_filter(GlobalConfig *cfg, LogProcessRule *rule) { + LogProcessRule *dup_rule = NULL; + + dup_rule = g_hash_table_lookup(cfg->filters, rule->name); + if (dup_rule) + { + msg_error("Duplicate item in configuration file", + evt_tag_str("filter", rule->name), + NULL); + log_process_rule_unref(rule); + return; + } g_hash_table_insert(cfg->filters, rule->name, rule); } void cfg_add_parser(GlobalConfig *cfg, LogProcessRule *rule) { + LogProcessRule *dup_rule = NULL; + + dup_rule = g_hash_table_lookup(cfg->parsers, rule->name); + if (dup_rule) + { + msg_error("Duplicate item in configuration file", + evt_tag_str("parser", rule->name), + NULL); + log_process_rule_unref(rule); + return; + } g_hash_table_insert(cfg->parsers, rule->name, rule); } void cfg_add_rewrite(GlobalConfig *cfg, LogProcessRule *rule) { + LogProcessRule *dup_rule = NULL; + + dup_rule = g_hash_table_lookup(cfg->rewriters, rule->name); + if (dup_rule) + { + msg_error("Duplicate item in configuration file", + evt_tag_str("rewrite", rule->name), + NULL); + log_process_rule_unref(rule); + return; + } g_hash_table_insert(cfg->rewriters, rule->name, rule); } @@ -154,6 +213,17 @@ cfg_add_connection(GlobalConfig *cfg, LogConnection *conn) void cfg_add_template(GlobalConfig *cfg, LogTemplate *template) { + LogTemplate *dup_template = NULL; + + dup_template = g_hash_table_lookup(cfg->templates, template->name); + if (dup_template) + { + msg_error("Duplicate item in configuration file", + evt_tag_str("template", template->name), + NULL); + log_template_unref(template); + return; + } g_hash_table_insert(cfg->templates, template->name, template); }