]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
Add removal safe TAILQ iterator.
authorEric Leblond <eric@regit.org>
Wed, 28 Nov 2012 12:22:22 +0000 (13:22 +0100)
committerEric Leblond <eric@regit.org>
Wed, 28 Nov 2012 16:44:53 +0000 (17:44 +0100)
TAILQ_FOREACH macro was not safe for element removal as it was
accessing the next element in case of a free. This patch is inspired
by Linux list handling and provide a new macro TAILQ_FOREACH_SAFE.
This macro is removal safe and only differs by a last argument being
a temporaty pointer to an element.

src/queue.h
src/unix-manager.c

index 0a10f715555fbdcf42199d639d1672c2ae6e9d52..13455aa42905a0c5bdf8a12c700d5db0ff29f5c1 100644 (file)
@@ -346,6 +346,13 @@ struct {                                                           \
            (var) != TAILQ_END(head);                                   \
            (var) = TAILQ_NEXT(var, field))
 
+/* removal safe iterator using a temprary element has last param */
+#define TAILQ_FOREACH_SAFE(var, head, field, tvar)                                     \
+       for((var) = TAILQ_FIRST(head), \
+        (tvar) = TAILQ_FIRST(head) ? TAILQ_NEXT(TAILQ_FIRST(head), field): NULL ; \
+           (var) != TAILQ_END(head);                                   \
+           (var = tvar), (tvar) = var ? TAILQ_NEXT(var, field): NULL)
+
 #define TAILQ_FOREACH_REVERSE(var, head, headname, field)              \
        for((var) = TAILQ_LAST(head, headname);                         \
            (var) != TAILQ_END(head);                                   \
index 5230ba7025905bed6f72b5dbdabe74ca3199a7e8..8c42c42c5e9c7443c030254a2d092ae2e97e6621 100644 (file)
@@ -748,7 +748,8 @@ void *UnixManagerThread(void *td)
 
         if ((ret == 0) || (TmThreadsCheckFlag(th_v, THV_KILL))) {
             UnixClient *item;
-            TAILQ_FOREACH(item, &(&command)->clients, next) {
+            UnixClient *titem;
+            TAILQ_FOREACH_SAFE(item, &(&command)->clients, next, titem) {
                 close(item->fd);
                 SCFree(item);
             }