[syslog-ng] PATCH: Fix some small memory leaks and a SEGV
mark tomlinson
mark.tomlinson at alliedtelesis.co.nz
Tue May 5 22:26:42 CEST 2009
Fix various memory leaks caused by strings not being freed.
Also, in log_source_group_deinit(), ensure no drivers are still
pointing to this possibly soon-to-be-freed structure. Without this
a SIGSEGV was possible when a SIGHUP occured while syslog was busy.
diff --git a/src/afinet.c b/src/afinet.c
index 28b9d50..144a08a 100644
--- a/src/afinet.c
+++ b/src/afinet.c
@@ -191,6 +191,8 @@ afinet_sd_set_transport(LogDriver *s, const gchar *transport)
{
AFInetSourceDriver *self = (AFInetSourceDriver *) s;
+ if (self->super.transport)
+ g_free(self->super.transport);
self->super.transport = g_strdup(transport);
if (strcasecmp(transport, "udp") == 0)
{
diff --git a/src/afstreams.c b/src/afstreams.c
index df4e758..35d4812 100644
--- a/src/afstreams.c
+++ b/src/afstreams.c
@@ -104,6 +104,8 @@ afstreams_sd_set_sundoor(LogDriver *s, gchar *filename)
{
AFStreamsSourceDriver *self = (AFStreamsSourceDriver *) s;
+ if (self->door_filename)
+ g_string_free(self->door_filename, TRUE);
self->door_filename = g_string_new(filename);
}
diff --git a/src/dgroup.c b/src/dgroup.c
index 7919a54..be02899 100644
--- a/src/dgroup.c
+++ b/src/dgroup.c
@@ -76,6 +76,16 @@ log_dest_group_deinit(LogPipe *s)
NULL);
success = FALSE;
}
+ if (p->group)
+ {
+ g_free(p->group);
+ p->group = NULL;
+ }
+ if (p->id)
+ {
+ g_free(p->id);
+ p->id = NULL;
+ }
}
return success;
}
diff --git a/src/logsource.c b/src/logsource.c
index 311e61f..93a8747 100644
--- a/src/logsource.c
+++ b/src/logsource.c
@@ -181,6 +181,10 @@ log_source_set_options(LogSource *self, LogSourceOptions *options, gint stats_le
g_atomic_counter_set(&self->options->window_size, current_window);
self->stats_level = stats_level;
self->stats_source = stats_source;
+ if (self->stats_id)
+ g_free(self->stats_id);
+ if (self->stats_instance)
+ g_free(self->stats_instance);
self->stats_id = stats_id ? g_strdup(stats_id) : NULL;
self->stats_instance = stats_instance ? g_strdup(stats_instance): NULL;
}
diff --git a/src/logwriter.c b/src/logwriter.c
index 4c895cc..1d1e00e 100644
--- a/src/logwriter.c
+++ b/src/logwriter.c
@@ -792,6 +792,10 @@ log_writer_set_options(LogWriter *self, LogPipe *control, LogWriterOptions *opti
self->stats_level = stats_level;
self->stats_source = stats_source;
+ if (self->stats_id)
+ g_free(self->stats_id);
+ if (self->stats_instance)
+ g_free(self->stats_instance);
self->stats_id = stats_id ? g_strdup(stats_id) : NULL;
self->stats_instance = stats_instance ? g_strdup(stats_instance) : NULL;
diff --git a/src/sgroup.c b/src/sgroup.c
index 904237c..0fdf8fb 100644
--- a/src/sgroup.c
+++ b/src/sgroup.c
@@ -79,7 +79,18 @@ log_source_group_deinit(LogPipe *s)
evt_tag_str("id", p->id),
NULL);
success = FALSE;
- }
+ }
+ if (p->group)
+ {
+ g_free(p->group);
+ p->group = NULL;
+ }
+ if (p->id)
+ {
+ g_free(p->id);
+ p->id = NULL;
+ }
+ log_pipe_append(&p->super, NULL);
}
return success;
}
More information about the syslog-ng
mailing list