diff options
author | Eric Leblond <eric@inl.fr> | 2008-06-12 11:06:28 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2008-06-12 11:06:28 +0200 |
commit | 509bf34f1843203cdaa21bfbdb88212ab8de8c8f (patch) | |
tree | 13db141ae67f5130227422f4fc814aa28cc1fcc7 /src/ulogd.c | |
parent | 498711aaf9167061643feb802adb920f7ca3d0a2 (diff) |
Fix the propagation through the stack
When a plugin returns ULOGD_IRET_STOP, the propagation should
stop. This was not the case as break was used to do so but it was called
inside a switch and thus apply to the switch instruction and not to
the llist iteration.
Signed-off-by: Eric Leblond <eric@inl.fr>
Diffstat (limited to 'src/ulogd.c')
-rw-r--r-- | src/ulogd.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/ulogd.c b/src/ulogd.c index 8c8dc14..4e36984 100644 --- a/src/ulogd.c +++ b/src/ulogd.c @@ -477,6 +477,7 @@ static void ulogd_clean_results(struct ulogd_pluginstance *pi) void ulogd_propagate_results(struct ulogd_pluginstance *pi) { struct ulogd_pluginstance *cur = pi; + int abort_stack = 0; /* iterate over remaining plugin stack */ llist_for_each_entry_continue(cur, &pi->stack->list, list) { int ret; @@ -489,6 +490,7 @@ void ulogd_propagate_results(struct ulogd_pluginstance *pi) /* fallthrough */ case ULOGD_IRET_STOP: /* we shall abort further iteration of the stack */ + abort_stack = 1; break; case ULOGD_IRET_OK: /* we shall continue travelling down the stack */ @@ -497,8 +499,12 @@ void ulogd_propagate_results(struct ulogd_pluginstance *pi) ulogd_log(ULOGD_NOTICE, "unknown return value `%d' from plugin %s\n", ret, cur->plugin->name); + abort_stack = 1; break; } + + if (abort_stack) + break; } ulogd_clean_results(pi); |