sft freeing attempt made in
a575421 ("BUG/MINOR: sink: missing sft free in
sink_deinit()") is incomplete, because sink->sft is meant to be used as a
list and not a single sft entry.
Because of that, the previous fix only frees the first sft entry, which
fixes memory leaks for single-server forwarders (this is the case for
implicit rings), but could still result in memory leaks when multiple
servers are configured in a explicit ring sections.
What this patch does: instead of directly freeing sink->sft, it iterates
over every list members to free them.
It must be backported up to 2.4 with
a575421.
static void sink_deinit()
{
struct sink *sink, *sb;
+ struct sink_forward_target *sft_next;
list_for_each_entry_safe(sink, sb, &sink_list, sink_list) {
if (sink->type == SINK_TYPE_BUFFER) {
free_proxy(sink->forward_px);
free(sink->name);
free(sink->desc);
- free(sink->sft);
+ while (sink->sft) {
+ sft_next = sink->sft->next;
+ free(sink->sft);
+ sink->sft = sft_next;
+ }
free(sink);
}
}