From 26f11117088d46a56494c348736fd73b7869c59d Mon Sep 17 00:00:00 2001 From: Xufeng Zhang Date: Fri, 31 Oct 2014 09:31:50 +0800 Subject: syslog-ng: Fix memory leak when udp connection is used [ LIN7-1379 ] When udp connection is used, there are several memory leaks happen after run a long time. Signed-off-by: Xufeng Zhang Signed-off-by: Roy Li Signed-off-by: Martin Jansa --- .../logwriter-dont-allocate-a-new-buffer.patch | 26 +++++++ .../logwriter-still-free-the-unconsumed-item.patch | 47 ----------- .../rewrite-expr-grammar.ym-Free-up-token.patch | 17 ++++ .../files/still-free-the-unconsumed-item.patch | 90 ++++++++++++++++++++++ .../recipes-support/syslog-ng/syslog-ng_3.5.4.1.bb | 4 +- 5 files changed, 136 insertions(+), 48 deletions(-) create mode 100644 meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch delete mode 100644 meta-oe/recipes-support/syslog-ng/files/logwriter-still-free-the-unconsumed-item.patch create mode 100644 meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch create mode 100644 meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch (limited to 'meta-oe/recipes-support') diff --git a/meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch b/meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch new file mode 100644 index 0000000000..9e3d64bbf2 --- /dev/null +++ b/meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch @@ -0,0 +1,26 @@ +logwriter: Don't allocate a new buffer if fails to consume current item + +Upstream-Status: Pending + +Signed-off-by: Xufeng Zhang +--- +--- a/lib/logwriter.c ++++ b/lib/logwriter.c +@@ -1010,7 +1010,7 @@ + { + status = log_proto_client_post(proto, (guchar *) self->line_buffer->str, self->line_buffer->len, &consumed); + +- if (consumed) ++ if (consumed && status != LPS_ERROR) + log_writer_realloc_line_buffer(self); + + if (status == LPS_ERROR) +@@ -1028,7 +1028,7 @@ + NULL); + consumed = TRUE; + } +- if (consumed) ++ if (consumed && status != LPS_ERROR) + { + if (lm->flags & LF_LOCAL) + step_sequence_number(&self->seq_num); diff --git a/meta-oe/recipes-support/syslog-ng/files/logwriter-still-free-the-unconsumed-item.patch b/meta-oe/recipes-support/syslog-ng/files/logwriter-still-free-the-unconsumed-item.patch deleted file mode 100644 index 31110933f0..0000000000 --- a/meta-oe/recipes-support/syslog-ng/files/logwriter-still-free-the-unconsumed-item.patch +++ /dev/null @@ -1,47 +0,0 @@ -logwritter: still free the unconsumed item during reloading configuration - -Otherwise we have no chance to free this stuff. - -Upstream-Status: Pending - -Signed-off-by: Xufeng Zhang ---- ---- a/lib/logwriter.c -+++ b/lib/logwriter.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include "logproto/logproto-text-client.h" - - typedef enum - { -@@ -978,6 +979,7 @@ - gint count = 0; - gboolean ignore_throttle = (flush_mode >= LW_FLUSH_QUEUE); - LogProtoStatus status = LPS_SUCCESS; -+ LogProtoTextClient *self_text; - - if (!proto) - return FALSE; -@@ -1035,7 +1037,18 @@ - } - else - { -- /* push back to the queue */ -- log_queue_push_head(self->queue, lm, &path_options); -+ self_text = (LogProtoTextClient *) proto; -+ /* free the unconsumed message during reloading configuration */ -+ if ((LW_FLUSH_QUEUE == flush_mode) && self_text->partial_free && self_text->partial) -+ { -+ self_text->partial_free(self_text->partial); -+ self_text->partial = NULL; -+ log_msg_unref(lm); -+ } -+ else -+ { -+ /* push back to the queue */ -+ log_queue_push_head(self->queue, lm, &path_options); -+ } - msg_set_context(NULL); - log_msg_refcache_stop(); diff --git a/meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch b/meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch new file mode 100644 index 0000000000..1951af9fcc --- /dev/null +++ b/meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch @@ -0,0 +1,17 @@ +rewrite-expr-grammar.ym: Free up token. + +Upsteam-Status: Backport + +Reported-by: Xufeng Zhang +Signed-off-by: Viktor Tusa +--- +--- a/lib/rewrite/rewrite-expr-grammar.ym ++++ b/lib/rewrite/rewrite-expr-grammar.ym +@@ -78,6 +78,7 @@ + + $$ = log_template_new(configuration, $1); + CHECK_ERROR(log_template_compile($$, $1, &error), @1, "Error compiling template (%s)", error->message); ++ free($1); + } + ; + diff --git a/meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch b/meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch new file mode 100644 index 0000000000..ea18682300 --- /dev/null +++ b/meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch @@ -0,0 +1,90 @@ +From 365020c5c0823c91a8011e34597f970a7cfb4fb3 Mon Sep 17 00:00:00 2001 +From: Tusa Viktor +Date: Wed, 23 Apr 2014 17:10:58 +0000 +Subject: [PATCH] logwriter: still free the unconsumed item during reloading + configuration + +Upstream-Status: Backport + +Otherwise we have no chance to free this stuff. + +Reported-by: Xufeng Zhang +Signed-off-by: Tusa Viktor +Signed-off-by: Gergely Nagy +--- + lib/logproto/logproto-client.h | 2 +- + lib/logproto/logproto-text-client.c | 11 +++++++++++ + lib/logwriter.c | 9 +++++++-- + 3 files changed, 19 insertions(+), 3 deletions(-) + +diff --git a/lib/logproto/logproto-client.h b/lib/logproto/logproto-client.h +index 254ecf9..5adc917 100644 +--- a/lib/logproto/logproto-client.h ++++ b/lib/logproto/logproto-client.h +@@ -47,7 +47,6 @@ void log_proto_client_options_defaults(LogProtoClientOptions *options); + void log_proto_client_options_init(LogProtoClientOptions *options, GlobalConfig *cfg); + void log_proto_client_options_destroy(LogProtoClientOptions *options); + +- + struct _LogProtoClient + { + LogProtoStatus status; +@@ -107,6 +106,7 @@ log_proto_client_reset_error(LogProtoClient *s) + gboolean log_proto_client_validate_options(LogProtoClient *self); + void log_proto_client_init(LogProtoClient *s, LogTransport *transport, const LogProtoClientOptions *options); + void log_proto_client_free(LogProtoClient *s); ++void log_proto_client_free_method(LogProtoClient *s); + + #define DEFINE_LOG_PROTO_CLIENT(prefix) \ + static gpointer \ +diff --git a/lib/logproto/logproto-text-client.c b/lib/logproto/logproto-text-client.c +index 3248759..a5100f3 100644 +--- a/lib/logproto/logproto-text-client.c ++++ b/lib/logproto/logproto-text-client.c +@@ -146,12 +146,23 @@ log_proto_text_client_post(LogProtoClient *s, guchar *msg, gsize msg_len, gboole + } + + void ++log_proto_text_client_free(LogProtoClient *s) ++{ ++ LogProtoTextClient *self = (LogProtoTextClient *)s; ++ if (self->partial_free) ++ self->partial_free(self->partial); ++ self->partial = NULL; ++ log_proto_client_free_method(s); ++}; ++ ++void + log_proto_text_client_init(LogProtoTextClient *self, LogTransport *transport, const LogProtoClientOptions *options) + { + log_proto_client_init(&self->super, transport, options); + self->super.prepare = log_proto_text_client_prepare; + self->super.flush = log_proto_text_client_flush; + self->super.post = log_proto_text_client_post; ++ self->super.free_fn = log_proto_text_client_free; + self->super.transport = transport; + self->next_state = -1; + } +diff --git a/lib/logwriter.c b/lib/logwriter.c +index 3292e31..470bcdb 100644 +--- a/lib/logwriter.c ++++ b/lib/logwriter.c +@@ -1063,8 +1063,13 @@ log_writer_flush(LogWriter *self, LogWriterFlushMode flush_mode) + } + else + { +- /* push back to the queue */ +- log_queue_push_head(self->queue, lm, &path_options); ++ if (flush_mode == LW_FLUSH_QUEUE) ++ log_msg_unref(lm); ++ else ++ { ++ /* push back to the queue */ ++ log_queue_push_head(self->queue, lm, &path_options); ++ } + msg_set_context(NULL); + log_msg_refcache_stop(); + break; +-- +1.7.10.4 + diff --git a/meta-oe/recipes-support/syslog-ng/syslog-ng_3.5.4.1.bb b/meta-oe/recipes-support/syslog-ng/syslog-ng_3.5.4.1.bb index d5939e4623..b54842030c 100644 --- a/meta-oe/recipes-support/syslog-ng/syslog-ng_3.5.4.1.bb +++ b/meta-oe/recipes-support/syslog-ng/syslog-ng_3.5.4.1.bb @@ -9,10 +9,12 @@ SRC_URI += " \ file://Fix-the-memory-leak-problem-for-mutex.patch \ file://Fix-the-memory-leak-problem-when-HAVE_ENVIRON-defined.patch \ file://free-global-LogTemplateOptions.patch \ - file://logwriter-still-free-the-unconsumed-item.patch \ + file://still-free-the-unconsumed-item.patch \ file://syslog-ng-verify-the-list-before-del.patch \ file://configure.patch \ file://dbifix.patch \ + file://rewrite-expr-grammar.ym-Free-up-token.patch \ + file://logwriter-dont-allocate-a-new-buffer.patch \ " SRC_URI[md5sum] = "ff3bf223ebafbaa92b69a2d5b729f368" -- cgit 1.2.3-korg