Squashed 'import-layers/meta-openembedded/' content from commit 247b126
Change-Id: I40827e9ce5fba63f1cca2a0be44976ae8383b4c0
git-subtree-dir: import-layers/meta-openembedded
git-subtree-split: 247b1267bbe95719cd4877d2d3cfbaf2a2f4865a
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-for-mutex.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-for-mutex.patch
new file mode 100644
index 0000000..89022aa
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-for-mutex.patch
@@ -0,0 +1,58 @@
+Fix the memory leak problem for mutex
+
+Upstream-Status: Pending
+
+Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com>
+---
+ lib/logqueue.c | 1 +
+ modules/affile/affile-dest.c | 2 ++
+ modules/dbparser/dbparser.c | 1 +
+ 3 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/lib/logqueue.c b/lib/logqueue.c
+index 337a3c1..10edcf0 100644
+--- a/lib/logqueue.c
++++ b/lib/logqueue.c
+@@ -188,6 +188,7 @@ log_queue_init_instance(LogQueue *self, const gchar *persist_name)
+ void
+ log_queue_free_method(LogQueue *self)
+ {
++ g_static_mutex_free(&self->lock);
+ g_free(self->persist_name);
+ g_free(self);
+ }
+diff --git a/modules/affile/affile-dest.c b/modules/affile/affile-dest.c
+index a2bcdad..ce79f6f 100644
+--- a/modules/affile/affile-dest.c
++++ b/modules/affile/affile-dest.c
+@@ -305,6 +305,7 @@ affile_dw_free(LogPipe *s)
+ {
+ AFFileDestWriter *self = (AFFileDestWriter *) s;
+
++ g_static_mutex_free(&self->lock);
+ log_pipe_unref((LogPipe *) self->writer);
+ self->writer = NULL;
+ g_free(self->filename);
+@@ -687,6 +688,7 @@ affile_dd_free(LogPipe *s)
+ /* NOTE: this must be NULL as deinit has freed it, otherwise we'd have circular references */
+ g_assert(self->single_writer == NULL && self->writer_hash == NULL);
+
++ g_static_mutex_free(&self->lock);
+ log_template_unref(self->filename_template);
+ log_writer_options_destroy(&self->writer_options);
+ log_dest_driver_free(s);
+diff --git a/modules/dbparser/dbparser.c b/modules/dbparser/dbparser.c
+index f1248b5..9775701 100644
+--- a/modules/dbparser/dbparser.c
++++ b/modules/dbparser/dbparser.c
+@@ -284,6 +284,7 @@ log_db_parser_free(LogPipe *s)
+ {
+ LogDBParser *self = (LogDBParser *) s;
+
++ g_static_mutex_free(&self->lock);
+ if (self->db)
+ pattern_db_free(self->db);
+
+--
+1.7.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-when-HAVE_ENVIRON-defined.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-when-HAVE_ENVIRON-defined.patch
new file mode 100644
index 0000000..2ac9c0b
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/Fix-the-memory-leak-problem-when-HAVE_ENVIRON-defined.patch
@@ -0,0 +1,27 @@
+Fix the memory leak problem when HAVE_ENVIRON is defined
+
+Upstream-Status: Pending
+
+Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com>
+---
+--- a/lib/gprocess.c
++++ b/lib/gprocess.c
+@@ -1421,6 +1421,18 @@
+ void
+ g_process_finish(void)
+ {
++#ifdef HAVE_ENVIRON
++ int i = 0;
++
++ while (environ[i]) {
++ g_free(environ[i]);
++ ++i;
++ }
++ if (environ)
++ g_free(environ);
++ if (process_opts.argv_orig)
++ free(process_opts.argv_orig);
++#endif
+ g_process_remove_pidfile();
+ }
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/afsql-afsql_dd_insert_db-refactor.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/afsql-afsql_dd_insert_db-refactor.patch
new file mode 100644
index 0000000..42e181b
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/afsql-afsql_dd_insert_db-refactor.patch
@@ -0,0 +1,494 @@
+From 23e80b75508187baaa823a68ea019b72e0b2305c Mon Sep 17 00:00:00 2001
+From: Budai Laszlo <lbudai@balabit.hu>
+Date: Tue, 12 Nov 2013 13:19:04 +0100
+Subject: [PATCH] afsql: afsql_dd_insert_db() refactor
+
+Upstream-Status: Backport
+
+A lot of the code that was previously in afsql_dd_insert_db() have been
+extracted to smaller functions, and afsql_dd_insert_db() was rebuilt on
+top of these. At the same time, memory leaks were plugged, and in case
+of a transaction error, backlog rewinding has been fixed too, to not
+loose messages since the last BEGIN command.
+
+Signed-off-by: Juhasz Viktor <jviktor@balabit.hu>
+Signed-off-by: Laszlo Budai <lbudai@balabit.hu>
+---
+ modules/afsql/afsql.c | 301 ++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 192 insertions(+), 109 deletions(-)
+
+diff --git a/modules/afsql/afsql.c b/modules/afsql/afsql.c
+index 12f6aab..a6a8190 100644
+--- a/modules/afsql/afsql.c
++++ b/modules/afsql/afsql.c
+@@ -456,24 +456,21 @@ afsql_dd_create_index(AFSqlDestDriver *s
+ *
+ * NOTE: This function can only be called from the database thread.
+ **/
+-static GString *
+-afsql_dd_validate_table(AFSqlDestDriver *self, LogMessage *msg)
++static gboolean
++afsql_dd_validate_table(AFSqlDestDriver *self, GString *table)
+ {
+- GString *query_string, *table;
++ GString *query_string;
+ dbi_result db_res;
+ gboolean success = FALSE;
+ gint i;
+
+- table = g_string_sized_new(32);
+- log_template_format(self->table, msg, &self->template_options, LTZ_LOCAL, 0, NULL, table);
+-
+ if (self->flags & AFSQL_DDF_DONT_CREATE_TABLES)
+- return table;
++ return TRUE;
+
+ afsql_dd_check_sql_identifier(table->str, TRUE);
+
+ if (g_hash_table_lookup(self->validated_tables, table->str))
+- return table;
++ return TRUE;
+
+ query_string = g_string_sized_new(32);
+ g_string_printf(query_string, "SELECT * FROM %s WHERE 0=1", table->str);
+@@ -544,14 +541,9 @@ afsql_dd_validate_table(AFSqlDestDriver
+ /* we have successfully created/altered the destination table, record this information */
+ g_hash_table_insert(self->validated_tables, g_strdup(table->str), GUINT_TO_POINTER(TRUE));
+ }
+- else
+- {
+- g_string_free(table, TRUE);
+- table = NULL;
+- }
+ g_string_free(query_string, TRUE);
+
+- return table;
++ return success;
+ }
+
+ /**
+@@ -581,6 +573,20 @@ afsql_dd_begin_txn(AFSqlDestDriver *self
+ }
+
+ /**
++ * afsql_dd_handle_transaction_error:
++ *
++ * Handle errors inside during a SQL transaction (e.g. INSERT or COMMIT failures).
++ *
++ * NOTE: This function can only be called from the database thread.
++ **/
++static void
++afsql_dd_handle_transaction_error(AFSqlDestDriver *self)
++{
++ log_queue_rewind_backlog(self->queue);
++ self->flush_lines_queued = 0;
++}
++
++/**
+ * afsql_dd_begin_txn:
+ *
+ * Commit SQL transaction.
+@@ -596,14 +602,14 @@ afsql_dd_commit_txn(AFSqlDestDriver *sel
+ if (success)
+ {
+ log_queue_ack_backlog(self->queue, self->flush_lines_queued);
++ self->flush_lines_queued = 0;
+ }
+ else
+ {
+- msg_notice("SQL transaction commit failed, rewinding backlog and starting again",
+- NULL);
+- log_queue_rewind_backlog(self->queue);
++ msg_error("SQL transaction commit failed, rewinding backlog and starting again",
++ NULL);
++ afsql_dd_handle_transaction_error(self);
+ }
+- self->flush_lines_queued = 0;
+ return success;
+ }
+
+@@ -644,12 +650,13 @@ afsql_dd_set_dbd_opt_numeric(gpointer ke
+ }
+
+ static gboolean
+-afsql_dd_connect(AFSqlDestDriver *self)
++afsql_dd_ensure_initialized_connection(AFSqlDestDriver *self)
+ {
+ if (self->dbi_ctx)
+ return TRUE;
+
+ self->dbi_ctx = dbi_conn_new(self->type);
++
+ if (!self->dbi_ctx)
+ {
+ msg_error("No such DBI driver",
+@@ -659,10 +666,12 @@ afsql_dd_connect(AFSqlDestDriver *self)
+ }
+
+ dbi_conn_set_option(self->dbi_ctx, "host", self->host);
++
+ if (strcmp(self->type, "mysql"))
+ dbi_conn_set_option(self->dbi_ctx, "port", self->port);
+ else
+ dbi_conn_set_option_numeric(self->dbi_ctx, "port", atoi(self->port));
++
+ dbi_conn_set_option(self->dbi_ctx, "username", self->user);
+ dbi_conn_set_option(self->dbi_ctx, "password", self->password);
+ dbi_conn_set_option(self->dbi_ctx, "dbname", self->database);
+@@ -691,6 +700,7 @@ afsql_dd_connect(AFSqlDestDriver *self)
+ evt_tag_str("database", self->database),
+ evt_tag_str("error", dbi_error),
+ NULL);
++
+ return FALSE;
+ }
+
+@@ -713,104 +723,145 @@ afsql_dd_connect(AFSqlDestDriver *self)
+ return TRUE;
+ }
+
+-static gboolean
+-afsql_dd_insert_fail_handler(AFSqlDestDriver *self, LogMessage *msg,
+- LogPathOptions *path_options)
++static GString *
++afsql_dd_ensure_accessible_database_table(AFSqlDestDriver *self, LogMessage *msg)
+ {
+- if (self->failed_message_counter < self->num_retries - 1)
+- {
+- log_queue_push_head(self->queue, msg, path_options);
+-
+- /* database connection status sanity check after failed query */
+- if (dbi_conn_ping(self->dbi_ctx) != 1)
+- {
+- const gchar *dbi_error;
+-
+- dbi_conn_error(self->dbi_ctx, &dbi_error);
+- msg_error("Error, no SQL connection after failed query attempt",
+- evt_tag_str("type", self->type),
+- evt_tag_str("host", self->host),
+- evt_tag_str("port", self->port),
+- evt_tag_str("username", self->user),
+- evt_tag_str("database", self->database),
+- evt_tag_str("error", dbi_error),
+- NULL);
+- return FALSE;
+- }
++ GString *table = g_string_sized_new(32);
++ log_template_format(self->table, msg, &self->template_options, LTZ_LOCAL, 0, NULL, table);
+
+- self->failed_message_counter++;
+- return FALSE;
++ if (!afsql_dd_validate_table(self, table))
++ {
++ /* If validate table is FALSE then close the connection and wait time_reopen time (next call) */
++ msg_error("Error checking table, disconnecting from database, trying again shortly",
++ evt_tag_int("time_reopen", self->time_reopen),
++ NULL);
++ g_string_free(table, TRUE);
++ return NULL;
+ }
+
+- msg_error("Multiple failures while inserting this record into the database, message dropped",
+- evt_tag_int("attempts", self->num_retries),
+- NULL);
+- stats_counter_inc(self->dropped_messages);
+- log_msg_drop(msg, path_options);
+- self->failed_message_counter = 0;
+- return TRUE;
++ return table;
+ }
+
+ static GString *
+-afsql_dd_construct_query(AFSqlDestDriver *self, GString *table,
+- LogMessage *msg)
++afsql_dd_build_insert_command(AFSqlDestDriver *self, LogMessage *msg, GString *table)
+ {
+- GString *value;
+- GString *query_string;
+- gint i;
++ GString *insert_command = g_string_sized_new(256);
++ GString *value = g_string_sized_new(512);
++ gint i, j;
+
+- value = g_string_sized_new(256);
+- query_string = g_string_sized_new(512);
++ g_string_printf(insert_command, "INSERT INTO %s (", table->str);
+
+- g_string_printf(query_string, "INSERT INTO %s (", table->str);
+ for (i = 0; i < self->fields_len; i++)
+ {
+- g_string_append(query_string, self->fields[i].name);
+- if (i != self->fields_len - 1)
+- g_string_append(query_string, ", ");
++ if ((self->fields[i].flags & AFSQL_FF_DEFAULT) == 0 && self->fields[i].value != NULL)
++ {
++ g_string_append(insert_command, self->fields[i].name);
++
++ j = i + 1;
++ while (j < self->fields_len && (self->fields[j].flags & AFSQL_FF_DEFAULT) == AFSQL_FF_DEFAULT)
++ j++;
++
++ if (j < self->fields_len)
++ g_string_append(insert_command, ", ");
++ }
+ }
+- g_string_append(query_string, ") VALUES (");
++
++ g_string_append(insert_command, ") VALUES (");
+
+ for (i = 0; i < self->fields_len; i++)
+ {
+ gchar *quoted;
+
+- if (self->fields[i].value == NULL)
+- {
+- /* the config used the 'default' value for this column -> the fields[i].value is NULL, use SQL default */
+- g_string_append(query_string, "DEFAULT");
+- }
+- else
++ if ((self->fields[i].flags & AFSQL_FF_DEFAULT) == 0 && self->fields[i].value != NULL)
+ {
+ log_template_format(self->fields[i].value, msg, &self->template_options, LTZ_SEND, self->seq_num, NULL, value);
+-
+ if (self->null_value && strcmp(self->null_value, value->str) == 0)
+ {
+- g_string_append(query_string, "NULL");
++ g_string_append(insert_command, "NULL");
+ }
+ else
+ {
+ dbi_conn_quote_string_copy(self->dbi_ctx, value->str, "ed);
+ if (quoted)
+ {
+- g_string_append(query_string, quoted);
++ g_string_append(insert_command, quoted);
+ free(quoted);
+ }
+ else
+ {
+- g_string_append(query_string, "''");
++ g_string_append(insert_command, "''");
+ }
+ }
+- }
+
+- if (i != self->fields_len - 1)
+- g_string_append(query_string, ", ");
++ j = i + 1;
++ while (j < self->fields_len && (self->fields[j].flags & AFSQL_FF_DEFAULT) == AFSQL_FF_DEFAULT)
++ j++;
++ if (j < self->fields_len)
++ g_string_append(insert_command, ", ");
++ }
+ }
+- g_string_append(query_string, ")");
++
++ g_string_append(insert_command, ")");
+
+ g_string_free(value, TRUE);
+
+- return query_string;
++ return insert_command;
++}
++
++static inline gboolean
++afsql_dd_is_transaction_handling_enabled(const AFSqlDestDriver *self)
++{
++ return self->flush_lines_queued != -1;
++}
++
++static inline gboolean
++afsql_dd_should_start_new_transaction(const AFSqlDestDriver *self)
++{
++ return self->flush_lines_queued == 0;
++}
++
++static inline gboolean
++afsql_dd_should_commit_transaction(const AFSqlDestDriver *self)
++{
++ return afsql_dd_is_transaction_handling_enabled(self) && self->flush_lines_queued == self->flush_lines;
++}
++
++static inline gboolean
++afsql_dd_handle_insert_row_error_depending_on_connection_availability(AFSqlDestDriver *self,
++ LogMessage *msg,
++ LogPathOptions *path_options)
++{
++ const gchar *dbi_error, *error_message;
++
++ if (dbi_conn_ping(self->dbi_ctx) == 1)
++ {
++ log_queue_push_head(self->queue, msg, path_options);
++ return TRUE;
++ }
++
++ if (afsql_dd_is_transaction_handling_enabled(self))
++ {
++ error_message = "SQL connection lost in the middle of a transaction,"
++ " rewinding backlog and starting again";
++ afsql_dd_handle_transaction_error(self);
++ }
++ else
++ {
++ error_message = "Error, no SQL connection after failed query attempt";
++ log_queue_push_head(self->queue, msg, path_options);
++ }
++
++ dbi_conn_error(self->dbi_ctx, &dbi_error);
++ msg_error(error_message,
++ evt_tag_str("type", self->type),
++ evt_tag_str("host", self->host),
++ evt_tag_str("port", self->port),
++ evt_tag_str("username", self->user),
++ evt_tag_str("database", self->database),
++ evt_tag_str("error", dbi_error),
++ NULL);
++
++ return FALSE;
+ }
+
+ /**
+@@ -824,61 +875,93 @@ afsql_dd_construct_query(AFSqlDestDriver
+ static gboolean
+ afsql_dd_insert_db(AFSqlDestDriver *self)
+ {
+- GString *table, *query_string;
++ GString *table = NULL;
++ GString *insert_command = NULL;
+ LogMessage *msg;
+ gboolean success;
+ LogPathOptions path_options = LOG_PATH_OPTIONS_INIT;
+
+- afsql_dd_connect(self);
++ if (!afsql_dd_ensure_initialized_connection(self))
++ return FALSE;
+
+- success = log_queue_pop_head(self->queue, &msg, &path_options, (self->flags & AFSQL_DDF_EXPLICIT_COMMITS), FALSE);
++ /* connection established, try to insert a message */
++ success = log_queue_pop_head(self->queue, &msg, &path_options, FALSE, self->flags & AFSQL_DDF_EXPLICIT_COMMITS);
+ if (!success)
+ return TRUE;
+
+ msg_set_context(msg);
+
+- table = afsql_dd_validate_table(self, msg);
++ table = afsql_dd_ensure_accessible_database_table(self, msg);
++
+ if (!table)
+ {
+- /* If validate table is FALSE then close the connection and wait time_reopen time (next call) */
+- msg_error("Error checking table, disconnecting from database, trying again shortly",
+- evt_tag_int("time_reopen", self->time_reopen),
+- NULL);
+- msg_set_context(NULL);
+- g_string_free(table, TRUE);
+- return afsql_dd_insert_fail_handler(self, msg, &path_options);
++ success = FALSE;
++ goto out;
+ }
+
+- query_string = afsql_dd_construct_query(self, table, msg);
++ if (afsql_dd_should_start_new_transaction(self) && !afsql_dd_begin_txn(self))
++ {
++ success = FALSE;
++ goto out;
++ }
+
+- if (self->flush_lines_queued == 0 && !afsql_dd_begin_txn(self))
+- return FALSE;
++ insert_command = afsql_dd_build_insert_command(self, msg, table);
++ success = afsql_dd_run_query(self, insert_command->str, FALSE, NULL);
+
+- success = afsql_dd_run_query(self, query_string->str, FALSE, NULL);
+ if (success && self->flush_lines_queued != -1)
+ {
+ self->flush_lines_queued++;
+
+- if (self->flush_lines && self->flush_lines_queued == self->flush_lines && !afsql_dd_commit_txn(self))
+- return FALSE;
++ if (afsql_dd_should_commit_transaction(self) && !afsql_dd_commit_txn(self))
++ {
++ /* Assuming that in case of error, the queue is rewound by afsql_dd_commit_txn() */
++
++ g_string_free(insert_command, TRUE);
++ msg_set_context(NULL);
++
++ return FALSE;
++ }
+ }
+
+- g_string_free(table, TRUE);
+- g_string_free(query_string, TRUE);
++ out:
++
++ if (table != NULL)
++ g_string_free(table, TRUE);
++
++ if (insert_command != NULL)
++ g_string_free(insert_command, TRUE);
+
+ msg_set_context(NULL);
+
+- if (!success)
+- return afsql_dd_insert_fail_handler(self, msg, &path_options);
++ if (success)
++ {
++ log_msg_ack(msg, &path_options);
++ log_msg_unref(msg);
++ step_sequence_number(&self->seq_num);
++ self->failed_message_counter = 0;
++ }
++ else
++ {
++ if (self->failed_message_counter < self->num_retries - 1)
++ {
++ if (!afsql_dd_handle_insert_row_error_depending_on_connection_availability(self, msg, &path_options))
++ return FALSE;
+
+- /* we only ACK if each INSERT is a separate transaction */
+- if ((self->flags & AFSQL_DDF_EXPLICIT_COMMITS) == 0)
+- log_msg_ack(msg, &path_options);
+- log_msg_unref(msg);
+- step_sequence_number(&self->seq_num);
+- self->failed_message_counter = 0;
++ self->failed_message_counter++;
++ }
++ else
++ {
++ msg_error("Multiple failures while inserting this record into the database, message dropped",
++ evt_tag_int("attempts", self->num_retries),
++ NULL);
++ stats_counter_inc(self->dropped_messages);
++ log_msg_drop(msg, &path_options);
++ self->failed_message_counter = 0;
++ success = TRUE;
++ }
++ }
+
+- return TRUE;
++ return success;
+ }
+
+ static void
+@@ -895,7 +978,7 @@ afsql_dd_message_became_available_in_the
+ static void
+ afsql_dd_wait_for_suspension_wakeup(AFSqlDestDriver *self)
+ {
+- /* we got suspended, probably because of a connection error,
++ /* we got suspended, probably because of a connection error,
+ * during this time we only get wakeups if we need to be
+ * terminated. */
+ if (!self->db_thread_terminate)
+@@ -974,8 +1057,7 @@ afsql_dd_database_thread(gpointer arg)
+
+ afsql_dd_commit_txn(self);
+ }
+-
+- exit:
++exit:
+ afsql_dd_disconnect(self);
+
+ msg_verbose("Database thread finished",
+--
+1.8.4.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.ac-add-option-enable-thread-tls-to-manage-.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.ac-add-option-enable-thread-tls-to-manage-.patch
new file mode 100644
index 0000000..cc8d110
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.ac-add-option-enable-thread-tls-to-manage-.patch
@@ -0,0 +1,50 @@
+configure.ac: add option --enable-thread-tls to manage thread ssl support
+
+Add option --enable-thread-tls to manage the including of thread
+local storage, so we could explicitly disable it.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ configure.ac | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 474e094..cedca54 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -120,6 +120,9 @@ AC_ARG_ENABLE(memtrace,
+ AC_ARG_ENABLE(ssl,
+ [ --enable-ssl Enable SSL support.],,enable_ssl="auto")
+
++AC_ARG_ENABLE(thread-tls,
++ [ --enable-thread-tls Enable Thread Transport Layer Security support.],,enable_thread_tls="no")
++
+ AC_ARG_ENABLE(dynamic-linking,
+ [ --enable-dynamic-linking Link everything dynamically.],,enable_dynamic_linking="auto")
+
+@@ -381,12 +384,14 @@ dnl ***************************************************************************
+ dnl Is the __thread keyword available?
+ dnl ***************************************************************************
+
+-AC_LINK_IFELSE([AC_LANG_PROGRAM(
+-[[#include <pthread.h>
+-__thread int a;
+-]],
+-[a=0;])],
+-[ac_cv_have_tls=yes; AC_DEFINE_UNQUOTED(HAVE_THREAD_KEYWORD, 1, "Whether Transport Layer Security is supported by the system")])
++if test "x$enable_thread_tls" != "xno"; then
++ AC_LINK_IFELSE([AC_LANG_PROGRAM(
++ [[#include <pthread.h>
++ __thread int a;
++ ]],
++ [a=0;])],
++ [ac_cv_have_tls=yes; AC_DEFINE_UNQUOTED(HAVE_THREAD_KEYWORD, 1, "Whether Transport Layer Security is supported by the system")])
++fi
+
+ dnl ***************************************************************************
+ dnl How to do static linking?
+--
+1.9.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.patch
new file mode 100644
index 0000000..109f58c
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/configure.patch
@@ -0,0 +1,23 @@
+Index: syslog-ng-3.5.4.1/configure.ac
+===================================================================
+--- syslog-ng-3.5.4.1.orig/configure.ac 2014-07-18 13:49:36.794141441 +0000
++++ syslog-ng-3.5.4.1/configure.ac 2014-07-18 14:23:57.738197606 +0000
+@@ -8,7 +8,8 @@ dnl SNAPSHOT_VERSION - snapshot version to add to version number
+ dnl BINARY_BRANCH - the value is added to all source/binary packages
+ dnl SOURCE_REVISION - Revision of the source-tree, will added to the version string
+ dnl
+-AC_INIT(syslog-ng/main.c)
++AC_INIT(syslog-ng, 3.5.4.1)
++AC_CONFIG_SRCDIR(syslog-ng/main.c)
+ AC_CONFIG_MACRO_DIR([m4])
+ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+@@ -53,7 +54,7 @@ else
+ CURRDATE=`date +"%a, %d %b %Y %H:%M:%S %Z"`
+ fi
+
+-AM_INIT_AUTOMAKE($PACKAGE, $VERSION, [foreign no-define subdir-objects])
++AM_INIT_AUTOMAKE([foreign no-define subdir-objects])
+ _AM_PROG_TAR([ustar])
+ if test -n "$SNAPSHOT_VERSION"; then
+ VERSION=$VERSION+$SNAPSHOT_VERSION
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/dbifix.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/dbifix.patch
new file mode 100644
index 0000000..15dfb68
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/dbifix.patch
@@ -0,0 +1,20 @@
+Index: syslog-ng-3.5.4.1/configure.ac
+===================================================================
+--- syslog-ng-3.5.4.1.orig/configure.ac 2014-07-18 14:35:03.134215740 +0000
++++ syslog-ng-3.5.4.1/configure.ac 2014-07-18 15:31:52.510308653 +0000
+@@ -576,13 +576,14 @@
+ dnl ***************************************************************************
+
+ AC_CHECK_LIB(dl, dlsym, DL_LIBS="-ldl")
++if test "x$enable_sql" != "xno"; then
+ PKG_CHECK_MODULES(LIBDBI, dbi >= $LIBDBI_MIN_VERSION, libdbi_pkgconfig_not_found="0", libdbi_pkgconfig_not_found="1")
+
+ if test "$libdbi_pkgconfig_not_found" -eq 1; then
+ dnl if libdbi has no .pc file, try it without one
+ AC_CHECK_LIB(dbi, dbi_initialize, LIBDBI_LIBS="-ldbi"; LIBDBI_CFLAGS="-I/usr/include")
+ fi
+-
++fi
+ if test "x$enable_sql" = "xauto"; then
+ AC_MSG_CHECKING(whether to enable SQL support)
+ if test "x$LIBDBI_LIBS" != "x"; then
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/deinit-the-new-config-when-reverting-to-the.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/deinit-the-new-config-when-reverting-to-the.patch
new file mode 100644
index 0000000..484af7e
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/deinit-the-new-config-when-reverting-to-the.patch
@@ -0,0 +1,36 @@
+From 86842df8bff5c97e44fc55d2fb7fc6c10f56ab84 Mon Sep 17 00:00:00 2001
+From: Gergely Nagy <algernon@balabit.hu>
+Date: Fri, 13 Dec 2013 13:46:15 +0100
+Subject: [PATCH] mainloop: Deinit the new config when reverting to the old one
+
+Upstream-Status: Backport
+
+When reloading, and the new config fails, deinit it before initializing
+the old config. This is so that conflicting things do not remain held by
+the half-initialized new config, while the old tries to take it
+over. (It also removed a couple of memory leaks, most likely.)
+
+The reason we can do this, is because cfg_tree_stop() (called by
+cfg_deinit()) goes over all the known nodes, and log_pipe_deinit() is
+also smart enough to not deinit a node that has not been inited before.
+
+Signed-off-by: Gergely Nagy <algernon@balabit.hu>
+---
+ lib/mainloop.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/lib/mainloop.c b/lib/mainloop.c
+index 34655fa..e6fbb59 100644
+--- a/lib/mainloop.c
++++ b/lib/mainloop.c
+@@ -510,6 +510,7 @@ main_loop_reload_config_apply(void)
+ {
+ msg_error("Error initializing new configuration, reverting to old config", NULL);
+ cfg_persist_config_move(main_loop_new_config, main_loop_old_config);
++ cfg_deinit(main_loop_new_config);
+ if (!cfg_init(main_loop_old_config))
+ {
+ /* hmm. hmmm, error reinitializing old configuration, we're hosed.
+--
+1.8.4.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-a-memory-leak-in-log_driver_free.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-a-memory-leak-in-log_driver_free.patch
new file mode 100644
index 0000000..2603474
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-a-memory-leak-in-log_driver_free.patch
@@ -0,0 +1,33 @@
+From a269669ba3cb6d1c06a3322b4a6a035cb787d085 Mon Sep 17 00:00:00 2001
+From: Gergely Nagy <algernon@balabit.hu>
+Date: Tue, 14 Jan 2014 13:58:05 +0100
+Subject: [PATCH] driver: Fix a memory leak in log_driver_free()
+
+Upstream-Status: Backport
+
+After freeing up the members of self->plugins, free self->plugins itself
+too.
+
+Signed-off-by: Gergely Nagy <algernon@balabit.hu>
+---
+ lib/driver.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/lib/driver.c b/lib/driver.c
+index d77fe57..a6867b9 100644
+--- a/lib/driver.c
++++ b/lib/driver.c
+@@ -91,6 +91,10 @@ log_driver_free(LogPipe *s)
+ {
+ log_driver_plugin_free((LogDriverPlugin *) l->data);
+ }
++ if (self->plugins)
++ {
++ g_list_free(self->plugins);
++ }
+ if (self->group)
+ g_free(self->group);
+ if (self->id)
+--
+1.8.4.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-config-libnet.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-config-libnet.patch
new file mode 100644
index 0000000..755803c
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-config-libnet.patch
@@ -0,0 +1,66 @@
+Subject: [PATCH] add libnet enable option
+
+Upstream-Status: Pending
+
+This would avoid a implicit auto-detecting result.
+
+Signed-off-by: Ming Liu <ming.liu@windriver.com>
+Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
+---
+ configure.ac | 27 +++++++++++++++++----------
+ 1 files changed, 17 insertions(+), 10 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index b1e18b4..8e13025 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -73,6 +73,9 @@ AC_CONFIG_HEADERS(config.h)
+ dnl ***************************************************************************
+ dnl Arguments
+
++AC_ARG_ENABLE(libnet,
++ [ --enable-libnet Enable libnet support.],, enable_libnet="no")
++
+ AC_ARG_WITH(libnet,
+ [ --with-libnet=path use path to libnet-config script],
+ ,
+@@ -768,22 +771,26 @@ dnl ***************************************************************************
+ dnl libnet headers/libraries
+ dnl ***************************************************************************
+ AC_MSG_CHECKING(for LIBNET)
+-if test "x$with_libnet" = "x"; then
+- LIBNET_CONFIG="`which libnet-config`"
+-else
+- LIBNET_CONFIG="$with_libnet/libnet-config"
+-fi
++if test "x$enable_libnet" = xyes; then
++ if test "x$with_libnet" = "x"; then
++ LIBNET_CONFIG="`which libnet-config`"
++ else
++ LIBNET_CONFIG="$with_libnet/libnet-config"
++ fi
++
++ if test -n "$LIBNET_CONFIG" -a -x "$LIBNET_CONFIG"; then
++ LIBNET_CFLAGS="`$LIBNET_CONFIG --defines`"
++ LIBNET_LIBS="`$LIBNET_CONFIG --libs`"
++ AC_MSG_RESULT(yes)
++ else
++ AC_MSG_ERROR([Could not find libnet, and libnet support was explicitly enabled.])
++ fi
+
+-if test -n "$LIBNET_CONFIG" -a -x "$LIBNET_CONFIG"; then
+- LIBNET_CFLAGS="`$LIBNET_CONFIG --defines`"
+- LIBNET_LIBS="`$LIBNET_CONFIG --libs`"
+- AC_MSG_RESULT(yes)
+ else
+ LIBNET_LIBS=
+ AC_MSG_RESULT(no)
+ fi
+
+-
+ if test "x$enable_spoof_source" = "xauto"; then
+ AC_MSG_CHECKING(whether to enable spoof source support)
+ if test "x$LIBNET_LIBS" != "x"; then
+--
+1.7.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-invalid-ownership.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-invalid-ownership.patch
new file mode 100644
index 0000000..faf9672
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/fix-invalid-ownership.patch
@@ -0,0 +1,28 @@
+syslog-ng: fix wrong ownership issue
+
+Upstream-Status: Pending
+
+The ownership of build user is preserved for some target files, fixed it by
+adding --no-same-owner option to tar when extracting files.
+
+Signed-off-by: Ming Liu <ming.liu@windriver.com>
+---
+ scl/Makefile.am | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/scl/Makefile.am b/scl/Makefile.am
+index 57fad5d..2a29ca5 100644
+--- a/scl/Makefile.am
++++ b/scl/Makefile.am
+@@ -14,7 +14,7 @@ scl-install-data-local:
+ fi; \
+ done
+ $(mkinstalldirs) $(DESTDIR)/$(scldir)
+- (cd $(srcdir)/scl; tar cf - $(SCL_SUBDIRS)) | (cd $(DESTDIR)/$(scldir) && tar xf -)
++ (cd $(srcdir)/scl; tar cf - $(SCL_SUBDIRS)) | (cd $(DESTDIR)/$(scldir) && tar xf - --no-same-owner)
+ chmod -R u+rwX $(DESTDIR)/$(scldir)
+
+ scl-uninstall-local:
+--
+1.7.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/free-global-LogTemplateOptions.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/free-global-LogTemplateOptions.patch
new file mode 100644
index 0000000..d439a26
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/free-global-LogTemplateOptions.patch
@@ -0,0 +1,30 @@
+From 3ef6ca8044260c77118edca6dead807a2edcb5ef Mon Sep 17 00:00:00 2001
+From: Balazs Scheidler <bazsi@balabit.hu>
+Date: Thu, 31 Oct 2013 13:20:12 +0100
+Subject: [PATCH] cfg: free global LogTemplateOptions
+
+Upstream-Status: Backport
+
+This fixes a potential memory leak when global template specific
+options were specified, such as local-time-zone(), send-time-zone() etc.
+
+Signed-off-by: Balazs Scheidler <bazsi@balabit.hu>
+---
+ lib/cfg.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/lib/cfg.c b/lib/cfg.c
+index 7f040b8..adeaaf8 100644
+--- a/lib/cfg.c
++++ b/lib/cfg.c
+@@ -411,6 +411,7 @@ cfg_free(GlobalConfig *self)
+ g_free(self->proto_template_name);
+ log_template_unref(self->file_template);
+ log_template_unref(self->proto_template);
++ log_template_options_destroy(&self->template_options);
+
+ if (self->bad_hostname_compiled)
+ regfree(&self->bad_hostname);
+--
+1.8.4.1
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/initscript b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/initscript
new file mode 100644
index 0000000..910030f
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/initscript
@@ -0,0 +1,62 @@
+#! /bin/sh
+#
+# This is an init script for openembedded
+# Copy it to /etc/init.d/syslog-ng and type
+# > update-rc.d syslog-ng defaults 5
+#
+
+# Source function library
+. /etc/init.d/functions
+
+syslog_ng=/usr/sbin/syslog-ng
+test -x "$syslog_ng" || exit 0
+
+PIDFILE=/var/run/syslog-ng/syslog-ng.pid
+
+create_xconsole() {
+ test -e /dev/xconsole || mknod -m 640 /dev/xconsole p
+ test -x /sbin/restorecon && /sbin/restorecon /dev/xconsole
+}
+
+RETVAL=0
+
+case "$1" in
+ start)
+ [ "${VERBOSE}" != "no" ] && echo -n "Starting syslog-ng:"
+ create_xconsole
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $syslog_ng
+ [ "${VERBOSE}" != "no" ] && echo "."
+ ;;
+ stop)
+ [ "${VERBOSE}" != "no" ] && echo -n "Stopping syslog-ng:"
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE
+ [ "${VERBOSE}" != "no" ] && echo "."
+ ;;
+ reload|force-reload)
+ start-stop-daemon --stop --quiet --signal 1 --exec $syslog_ng
+ ;;
+ restart)
+ echo "Stopping syslog-ng:"
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE
+ echo -n "Waiting for syslog-ng to die off"
+ for i in 1 2 3 ;
+ do
+ sleep 1
+ echo -n "."
+ done
+ echo ""
+ echo -n "Starting syslog-ng:"
+ create_xconsole
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $syslog_ng
+ echo "."
+ ;;
+ status)
+ status $syslog_ng
+ RETVAL=$?
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|reload|restart|force-reload|status}"
+ exit 1
+esac
+
+exit $RETVAL
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/logwriter-dont-allocate-a-new-buffer.patch
new file mode 100644
index 0000000..9e3d64b
--- /dev/null
+++ b/import-layers/meta-openembedded/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 <xufeng.zhang@windriver.com>
+---
+--- 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/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/rewrite-expr-grammar.ym-Free-up-token.patch
new file mode 100644
index 0000000..1951af9
--- /dev/null
+++ b/import-layers/meta-openembedded/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 <xufeng.zhang@windriver.com>
+Signed-off-by: Viktor Tusa <tusavik@gmail.com>
+---
+--- 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/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/still-free-the-unconsumed-item.patch
new file mode 100644
index 0000000..ea18682
--- /dev/null
+++ b/import-layers/meta-openembedded/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 <tusavik@gmail.com>
+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 <xufeng.zhang@windriver.com>
+Signed-off-by: Tusa Viktor <tusavik@gmail.com>
+Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
+---
+ 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/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng-verify-the-list-before-del.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng-verify-the-list-before-del.patch
new file mode 100644
index 0000000..e8119b8
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng-verify-the-list-before-del.patch
@@ -0,0 +1,38 @@
+Verify the validity of the pointer before delete it
+
+Otherwise, we got a crash at logqueue-fifo.c:344
+ 344 iv_list_del(&node->list);
+
+Upstream-Status: Pending
+
+Signed-off-by: Xufeng Zhang <xufeng.zhang@windriver.com>
+---
+--- a/lib/logqueue-fifo.c
++++ b/lib/logqueue-fifo.c
+@@ -339,15 +339,18 @@
+ *msg = node->msg;
+ path_options->ack_needed = node->ack_needed;
+ self->qoverflow_output_len--;
+- if (!push_to_backlog)
++ if ((&node->list) && (&node->list)->next && (&node->list)->prev)
+ {
+- iv_list_del(&node->list);
+- log_msg_free_queue_node(node);
+- }
+- else
+- {
+- iv_list_del_init(&node->list);
+- }
++ if (!push_to_backlog)
++ {
++ iv_list_del(&node->list);
++ log_msg_free_queue_node(node);
++ }
++ else
++ {
++ iv_list_del_init(&node->list);
++ }
++ }
+ }
+ else
+ {
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.conf b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.conf
new file mode 100644
index 0000000..f0da2b7
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.conf
@@ -0,0 +1,155 @@
+@version: 3.5
+#
+# Syslog-ng configuration file, compatible with default Debian syslogd
+# installation. Originally written by anonymous (I can't find his name)
+# Revised, and rewrited by me (SZALAY Attila <sasa@debian.org>)
+
+# First, set some global options.
+options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
+ owner("root"); group("adm"); perm(0640); stats_freq(0);
+ bad_hostname("^gconfd$");
+};
+
+########################
+# Sources
+########################
+# This is the default behavior of sysklogd package
+# Logs may come from unix stream, but not from another machine.
+#
+source s_src { unix-dgram("/dev/log"); internal();
+ file("/proc/kmsg" program_override("kernel"));
+};
+
+# If you wish to get logs from remote machine you should uncomment
+# this and comment the above source line.
+#
+#source s_net { tcp(ip(127.0.0.1) port(1000) authentication(required) encrypt(allow)); };
+
+########################
+# Destinations
+########################
+# First some standard logfile
+#
+destination d_auth { file("/var/log/auth.log"); };
+destination d_cron { file("/var/log/cron.log"); };
+destination d_daemon { file("/var/log/daemon.log"); };
+destination d_kern { file("/var/log/kern.log"); };
+destination d_lpr { file("/var/log/lpr.log"); };
+destination d_mail { file("/var/log/mail.log"); };
+destination d_syslog { file("/var/log/syslog"); };
+destination d_user { file("/var/log/user.log"); };
+destination d_uucp { file("/var/log/uucp.log"); };
+
+# This files are the log come from the mail subsystem.
+#
+destination d_mailinfo { file("/var/log/mail/mail.info"); };
+destination d_mailwarn { file("/var/log/mail/mail.warn"); };
+destination d_mailerr { file("/var/log/mail/mail.err"); };
+
+# Logging for INN news system
+#
+destination d_newscrit { file("/var/log/news/news.crit"); };
+destination d_newserr { file("/var/log/news/news.err"); };
+destination d_newsnotice { file("/var/log/news/news.notice"); };
+
+# Some `catch-all' logfiles.
+#
+destination d_debug { file("/var/log/debug"); };
+destination d_error { file("/var/log/error"); };
+destination d_messages { file("/var/log/messages"); };
+
+# The root's console.
+#
+destination d_console { usertty("root"); };
+
+# Virtual console.
+#
+destination d_console_all { file("/dev/tty10"); };
+
+# The named pipe /dev/xconsole is for the nsole' utility. To use it,
+# you must invoke nsole' with the -file' option:
+#
+# $ xconsole -file /dev/xconsole [...]
+#
+destination d_xconsole { pipe("/dev/xconsole"); };
+
+# Send the messages to an other host
+#
+#destination d_net { tcp("127.0.0.1" port(1000) authentication(on) encrypt(on) log_fifo_size(1000)); };
+
+# Debian only
+destination d_ppp { file("/var/log/ppp.log"); };
+
+########################
+# Filters
+########################
+# Here's come the filter options. With this rules, we can set which
+# message go where.
+
+filter f_dbg { level(debug); };
+filter f_info { level(info); };
+filter f_notice { level(notice); };
+filter f_warn { level(warn); };
+filter f_err { level(err); };
+filter f_crit { level(crit .. emerg); };
+
+filter f_debug { level(debug) and not facility(auth, authpriv, news, mail); };
+filter f_error { level(err .. emerg) ; };
+filter f_messages { level(info,notice,warn) and
+ not facility(auth,authpriv,cron,daemon,mail,news); };
+
+filter f_auth { facility(auth, authpriv) and not filter(f_debug); };
+filter f_cron { facility(cron) and not filter(f_debug); };
+filter f_daemon { facility(daemon) and not filter(f_debug); };
+filter f_kern { facility(kern) and not filter(f_debug); };
+filter f_lpr { facility(lpr) and not filter(f_debug); };
+filter f_local { facility(local0, local1, local3, local4, local5,
+ local6, local7) and not filter(f_debug); };
+filter f_mail { facility(mail) and not filter(f_debug); };
+filter f_news { facility(news) and not filter(f_debug); };
+filter f_syslog3 { not facility(auth, authpriv, mail) and not filter(f_debug); };
+filter f_user { facility(user) and not filter(f_debug); };
+filter f_uucp { facility(uucp) and not filter(f_debug); };
+
+filter f_cnews { level(notice, err, crit) and facility(news); };
+filter f_cother { level(debug, info, notice, warn) or facility(daemon, mail); };
+
+filter f_ppp { facility(local2) and not filter(f_debug); };
+filter f_console { level(warn .. emerg); };
+
+########################
+# Log paths
+########################
+log { source(s_src); filter(f_auth); destination(d_auth); };
+log { source(s_src); filter(f_cron); destination(d_cron); };
+log { source(s_src); filter(f_daemon); destination(d_daemon); };
+log { source(s_src); filter(f_kern); destination(d_kern); };
+log { source(s_src); filter(f_lpr); destination(d_lpr); };
+log { source(s_src); filter(f_syslog3); destination(d_syslog); };
+log { source(s_src); filter(f_user); destination(d_user); };
+log { source(s_src); filter(f_uucp); destination(d_uucp); };
+
+log { source(s_src); filter(f_mail); destination(d_mail); };
+#log { source(s_src); filter(f_mail); filter(f_info); destination(d_mailinfo); };
+#log { source(s_src); filter(f_mail); filter(f_warn); destination(d_mailwarn); };
+#log { source(s_src); filter(f_mail); filter(f_err); destination(d_mailerr); };
+
+log { source(s_src); filter(f_news); filter(f_crit); destination(d_newscrit); };
+log { source(s_src); filter(f_news); filter(f_err); destination(d_newserr); };
+log { source(s_src); filter(f_news); filter(f_notice); destination(d_newsnotice); };
+#log { source(s_src); filter(f_cnews); destination(d_console_all); };
+#log { source(s_src); filter(f_cother); destination(d_console_all); };
+
+#log { source(s_src); filter(f_ppp); destination(d_ppp); };
+
+log { source(s_src); filter(f_debug); destination(d_debug); };
+log { source(s_src); filter(f_error); destination(d_error); };
+log { source(s_src); filter(f_messages); destination(d_messages); };
+
+log { source(s_src); filter(f_console); destination(d_console_all);
+ destination(d_xconsole); };
+log { source(s_src); filter(f_crit); destination(d_console); };
+
+# All messages send to a remote site
+#
+#log { source(s_src); destination(d_net); };
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.service-the-syslog-ng-service.patch b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.service-the-syslog-ng-service.patch
new file mode 100644
index 0000000..f53c607
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/syslog-ng.service-the-syslog-ng-service.patch
@@ -0,0 +1,32 @@
+From 0be9c08dd3f825e92fa02d4a08d8aff743109e61 Mon Sep 17 00:00:00 2001
+From: Li xin <lixin.fnst@cn.fujitsu.com>
+Date: Wed, 17 Jun 2015 14:46:30 +0900
+Subject: [PATCH] syslog-ng.service: the syslog-ng service can not start
+ successfully,so modify it.
+
+Upstream-Status: pending
+
+Signed-off-by: Li Xin <lixin.fnst@cn.fujitsu.com>
+---
+ contrib/systemd/syslog-ng.service | 5 ++---
+ 1 file changed, 2 insertion(+), 3 deletions(-)
+
+diff --git a/contrib/systemd/syslog-ng.service b/contrib/systemd/syslog-ng.service
+index fc16f8d..8e09deb 100644
+--- a/contrib/systemd/syslog-ng.service
++++ b/contrib/systemd/syslog-ng.service
+@@ -3,9 +3,8 @@ Description=System Logger Daemon
+ Documentation=man:syslog-ng(8)
+
+ [Service]
+-Type=notify
+-ExecStart=/usr/sbin/syslog-ng -F
+-ExecReload=/bin/kill -HUP $MAINPID
++ExecStart=@SBINDIR@/syslog-ng -F -p @LOCALSTATEDIR@/run/syslogd.pid
++ExecReload=@BASEBINDIR@/kill -HUP $MAINPID
+ StandardOutput=journal
+ StandardError=journal
+ Restart=on-failure
+--
+1.8.4.2
+
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/volatiles.03_syslog-ng b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/volatiles.03_syslog-ng
new file mode 100644
index 0000000..3c4a50d
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/files/volatiles.03_syslog-ng
@@ -0,0 +1 @@
+d root root 0755 /var/run/syslog-ng none
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng.inc b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng.inc
new file mode 100644
index 0000000..4e0f697
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng.inc
@@ -0,0 +1,118 @@
+SUMMARY = "Alternative system logger daemon"
+DESCRIPTION = "syslog-ng, as the name shows, is a syslogd replacement, \
+but with new functionality for the new generation. The original syslogd \
+allows messages only to be sorted based on priority/facility pairs; \
+syslog-ng adds the possibility to filter based on message contents using \
+regular expressions. The new configuration scheme is intuitive and powerful. \
+Forwarding logs over TCP and remembering all forwarding hops makes it \
+ideal for firewalled environments. \
+"
+HOMEPAGE = "http://www.balabit.com/network-security/syslog-ng/opensource-logging-system"
+
+LICENSE = "GPLv2 & LGPLv2.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=e0e8658d9be248f01b7933df24dc1408"
+
+# util-linux added to get libuuid
+DEPENDS = "libpcre flex eventlog glib-2.0 util-linux"
+
+SRC_URI = "http://www.balabit.com/downloads/files/syslog-ng/sources/${PV}/source/${BPN}_${PV}.tar.gz \
+ file://syslog-ng.conf \
+ file://initscript \
+ file://volatiles.03_syslog-ng \
+ file://configure.ac-add-option-enable-thread-tls-to-manage-.patch \
+"
+
+inherit autotools systemd pkgconfig update-alternatives update-rc.d
+
+EXTRA_OECONF = " \
+ --enable-dynamic-linking \
+ --disable-sub-streams \
+ --disable-pacct \
+ --localstatedir=${localstatedir}/lib/${BPN} \
+ --sysconfdir=${sysconfdir}/${BPN} \
+ --with-module-dir=${libdir}/${BPN} \
+ --with-sysroot=${STAGING_DIR_HOST} \
+ --with-libmongo-client=no --disable-mongodb \
+ --with-librabbitmq-client=no \
+ ${CONFIG_TLS} \
+"
+
+CONFIG_TLS = "--enable-thread-tls"
+CONFIG_TLS_arm = "${@base_conditional( "DEBUG_BUILD", "1", " --disable-thread-tls", " --enable-thread-tls", d )}"
+
+PACKAGECONFIG ??= "openssl \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 'ipv6', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \
+"
+PACKAGECONFIG[openssl] = "--enable-ssl,--disable-ssl,openssl,"
+PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6,,"
+PACKAGECONFIG[systemd] = "--enable-systemd --with-systemdsystemunitdir=${systemd_unitdir}/system/,--disable-systemd --without-systemdsystemunitdir,systemd,"
+PACKAGECONFIG[linux-caps] = "--enable-linux-caps,--disable-linux-caps,libcap,"
+PACKAGECONFIG[pcre] = "--enable-pcre,--disable-pcre,libpcre,"
+PACKAGECONFIG[dbi] = "--enable-sql,--disable-sql,libdbi,"
+PACKAGECONFIG[libnet] = "--enable-libnet --with-libnet=${STAGING_BINDIR_CROSS},--disable-libnet,libnet,"
+PACKAGECONFIG[smtp] = "--enable-smtp --with-libesmtp=${STAGING_LIBDIR},--disable-smtp,libesmtp,"
+PACKAGECONFIG[json] = "--enable-json,--disable-json,json-c,"
+PACKAGECONFIG[tcp-wrapper] = "--enable-tcp-wrapper,--disable-tcp-wrapper,tcp-wrappers,"
+PACKAGECONFIG[geoip] = "--enable-geoip,--disable-geoip,geoip,"
+
+do_configure_prepend() {
+ eval "${@bb.utils.contains('DISTRO_FEATURES', 'largefile', '', 'sed -i -e "s/-D_LARGEFILE_SOURCE//" -e "s/-D_FILE_OFFSET_BITS=64//" ${S}/configure.in', d)}"
+}
+
+do_install_append() {
+ install -d ${D}/${sysconfdir}/${BPN}
+ install ${WORKDIR}/syslog-ng.conf ${D}${sysconfdir}/${BPN}/${BPN}.conf
+ install -d ${D}/${sysconfdir}/init.d
+ install -m 755 ${WORKDIR}/initscript ${D}/${sysconfdir}/init.d/syslog.${BPN}
+ install -d ${D}/${sysconfdir}/default/volatiles/
+ install -m 755 ${WORKDIR}/volatiles.03_syslog-ng ${D}/${sysconfdir}/default/volatiles/03_syslog-ng
+ install -d ${D}/${localstatedir}/lib/${BPN}
+ # Remove /var/run as it is created on startup
+ rm -rf ${D}${localstatedir}/run
+ sed -i -e 's,@SBINDIR@,${sbindir},g' ${S}/contrib/systemd/*.service
+ sed -i -e 's,@LOCALSTATEDIR@,${localstatedir},g' ${S}/contrib/systemd/*.service
+ sed -i -e 's,@BASEBINDIR@,${base_bindir},g' ${S}/contrib/systemd/*.service
+}
+
+FILES_${PN} += "${datadir}/include/scl/ ${datadir}/xsd ${datadir}/tools"
+RDEPENDS_${PN} += "gawk"
+
+# This overcomes the syslog-ng rdepends on syslog-ng-dev QA Error
+PACKAGES =+ "${PN}-libs ${PN}-libs-dev ${PN}-libs-dbg"
+FILES_${PN}-libs = "${libdir}/${BPN}/*.so ${libdir}/libsyslog-ng-*.so*"
+FILES_${PN}-libs-dev = "${libdir}/${BPN}/lib*.la"
+FILES_${PN}-libs-dbg = "${libdir}/${BPN}/.debug"
+FILES_${PN}-staticdev = "${libdir}/${BPN}/libtest/*.a"
+INSANE_SKIP_${PN}-libs = "dev-so"
+RDEPENDS_${PN} += "${PN}-libs"
+
+CONFFILES_${PN} = "${sysconfdir}/${BPN}.conf ${sysconfdir}/scl.conf"
+
+# syslog initscript is handled explicitly because order of
+# update-rc.d and update-alternatives is important
+RDEPENDS_${PN} += " ${@base_conditional("ONLINE_PACKAGE_MANAGEMENT", "none", "", "update-rc.d", d)}"
+
+RPROVIDES_${PN} += "${PN}-systemd"
+RREPLACES_${PN} += "${PN}-systemd"
+RCONFLICTS_${PN} += "${PN}-systemd"
+SYSTEMD_SERVICE_${PN} = "${BPN}.service"
+
+# no syslog-init for systemd
+python () {
+ if bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
+ pn = d.getVar('PN', True)
+ sysconfdir = d.getVar('sysconfdir', True)
+ d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-init')
+ d.setVarFlag('ALTERNATIVE_PRIORITY', 'syslog-init', '200')
+ d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-init', '%s/init.d/syslog' % (sysconfdir))
+
+ if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d):
+ pn = d.getVar('PN', True)
+ d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-service')
+ d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-service', '%s/systemd/system/syslog.service' % (d.getVar('sysconfdir', True)))
+ d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-service', '%s/system/${BPN}.service' % (d.getVar('systemd_unitdir', True)))
+}
+
+INITSCRIPT_NAME = "syslog"
+INITSCRIPT_PARAMS = "start 20 2 3 4 5 . stop 90 0 1 6 ."
diff --git a/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng_3.6.4.bb b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng_3.6.4.bb
new file mode 100644
index 0000000..73609af
--- /dev/null
+++ b/import-layers/meta-openembedded/meta-oe/recipes-support/syslog-ng/syslog-ng_3.6.4.bb
@@ -0,0 +1,15 @@
+require syslog-ng.inc
+
+SRC_URI += " \
+ file://fix-a-memory-leak-in-log_driver_free.patch \
+ file://fix-config-libnet.patch \
+ file://fix-invalid-ownership.patch \
+ file://Fix-the-memory-leak-problem-for-mutex.patch \
+ file://Fix-the-memory-leak-problem-when-HAVE_ENVIRON-defined.patch \
+ file://configure.patch \
+ file://dbifix.patch \
+ file://syslog-ng.service-the-syslog-ng-service.patch \
+"
+
+SRC_URI[md5sum] = "e9f401615e92e5eb27396c995c1446ba"
+SRC_URI[sha256sum] = "7be11df31ac7d716f1f952e22b5ae8e2049edd633a41b223776a853d9106f4e7"