summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2011-01-07 13:19:25 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2011-01-07 13:19:25 +0100
commit6c21436c119cd7ba053937229aeb09dfd25925c2 (patch)
treeb10e4130068bbe8a9f4ea78c8b00067ee9094e15 /src
parent4f652cc32aebeac20f46009f146ad973a1ed0e99 (diff)
ulogd: fix double call of stop for reused input plugins
This patch adds reference counting for plugins. This is used to fix a double stop for input plugins that are reused. This problem was reported by Salih Gonullu <sag@open.ch>: http://marc.info/?l=netfilter&m=129439584700693&w=2 Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r--src/ulogd.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/ulogd.c b/src/ulogd.c
index f378c6f..a4b0ed1 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -762,6 +762,15 @@ static int pluginstance_started(struct ulogd_pluginstance *npi)
return 0;
}
+static int pluginstance_stop(struct ulogd_pluginstance *npi)
+{
+ if (--npi->plugin->usage > 0 &&
+ npi->plugin->input.type == ULOGD_DTYPE_SOURCE) {
+ return 0;
+ }
+ return 1;
+}
+
static int create_stack_start_instances(struct ulogd_pluginstance_stack *stack)
{
int ret;
@@ -839,6 +848,7 @@ static int create_stack(const char *option)
ret = -ENODEV;
goto out;
}
+ pl->usage++;
/* allocate */
pi = pluginstance_alloc_init(pl, pi_id, stack);
@@ -989,8 +999,8 @@ static void stop_pluginstances()
llist_for_each_entry(stack, &ulogd_pi_stacks, stack_list) {
llist_for_each_entry_safe(pi, npi, &stack->list, list) {
- if (((pi->plugin->priv_size == 0) || pi->private[0])
- && *pi->plugin->stop) {
+ if ((pi->plugin->priv_size > 0 || *pi->plugin->stop) &&
+ pluginstance_stop(pi)) {
ulogd_log(ULOGD_DEBUG, "calling stop for %s\n",
pi->plugin->name);
(*pi->plugin->stop)(pi);