netlabel: fix our progress tracking in netlbl_unlabel_staticlist()
[linux-2.6-microblaze.git] / net / netlabel / netlabel_unlabeled.c
index 2e8e3f7..fc55c91 100644 (file)
@@ -1166,12 +1166,13 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
        struct netlbl_unlhsh_walk_arg cb_arg;
        u32 skip_bkt = cb->args[0];
        u32 skip_chain = cb->args[1];
-       u32 iter_bkt;
-       u32 iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
+       u32 skip_addr4 = cb->args[2];
+       u32 iter_bkt, iter_chain, iter_addr4 = 0, iter_addr6 = 0;
        struct netlbl_unlhsh_iface *iface;
        struct list_head *iter_list;
        struct netlbl_af4list *addr4;
 #if IS_ENABLED(CONFIG_IPV6)
+       u32 skip_addr6 = cb->args[3];
        struct netlbl_af6list *addr6;
 #endif
 
@@ -1182,7 +1183,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
        rcu_read_lock();
        for (iter_bkt = skip_bkt;
             iter_bkt < rcu_dereference(netlbl_unlhsh)->size;
-            iter_bkt++, iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0) {
+            iter_bkt++) {
                iter_list = &rcu_dereference(netlbl_unlhsh)->tbl[iter_bkt];
                list_for_each_entry_rcu(iface, iter_list, list) {
                        if (!iface->valid ||
@@ -1190,7 +1191,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
                                continue;
                        netlbl_af4list_foreach_rcu(addr4,
                                                   &iface->addr4_list) {
-                               if (iter_addr4++ < cb->args[2])
+                               if (iter_addr4++ < skip_addr4)
                                        continue;
                                if (netlbl_unlabel_staticlist_gen(
                                              NLBL_UNLABEL_C_STATICLIST,
@@ -1203,10 +1204,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
                                        goto unlabel_staticlist_return;
                                }
                        }
+                       iter_addr4 = 0;
+                       skip_addr4 = 0;
 #if IS_ENABLED(CONFIG_IPV6)
                        netlbl_af6list_foreach_rcu(addr6,
                                                   &iface->addr6_list) {
-                               if (iter_addr6++ < cb->args[3])
+                               if (iter_addr6++ < skip_addr6)
                                        continue;
                                if (netlbl_unlabel_staticlist_gen(
                                              NLBL_UNLABEL_C_STATICLIST,
@@ -1219,8 +1222,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
                                        goto unlabel_staticlist_return;
                                }
                        }
+                       iter_addr6 = 0;
+                       skip_addr6 = 0;
 #endif /* IPv6 */
                }
+               iter_chain = 0;
+               skip_chain = 0;
        }
 
 unlabel_staticlist_return: