]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
Fix the propagation through the stack
authorEric Leblond <eric@inl.fr>
Thu, 12 Jun 2008 09:06:28 +0000 (11:06 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 12 Jun 2008 09:06:28 +0000 (11:06 +0200)
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>
src/ulogd.c

index 8c8dc14bc4abb1ad7c1a90a6f66665bb9813d4f7..4e369844b3ce84e024f1fa57b9424d75546e7e76 100644 (file)
@@ -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);