rhashtable: fix rht_for_each_entry_safe() endless loop
authorPatrick McHardy <kaber@trash.net>
Wed, 21 Jan 2015 11:12:13 +0000 (11:12 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Jan 2015 08:08:23 +0000 (00:08 -0800)
"next" is not updated, causing an endless loop for buckets with more than
one element.

Fixes: 88d6ed15acff ("rhashtable: Convert bucket iterators to take table and index")
Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/rhashtable.h

index a2562ed..e033784 100644 (file)
@@ -260,7 +260,9 @@ void rhashtable_destroy(struct rhashtable *ht);
             next = !rht_is_a_nulls(pos) ?                                  \
                       rht_dereference_bucket(pos->next, tbl, hash) : NULL; \
             (!rht_is_a_nulls(pos)) && rht_entry(tpos, pos, member);        \
-            pos = next)
+            pos = next,                                                    \
+            next = !rht_is_a_nulls(pos) ?                                  \
+                      rht_dereference_bucket(pos->next, tbl, hash) : NULL)
 
 /**
  * rht_for_each_rcu_continue - continue iterating over rcu hash chain