Re: iptables breakage WAS(Re: dummy as IMQ replacement
From: jamal <hidden>
Date: 2005-03-25 20:31:45
From the outset this looks fine. What would be a good test case?
Something that will ensure we go beyond 4K(NLMSG_GOODSIZE) for a dump? cheers, jamal On Fri, 2005-03-25 at 15:07, Patrick McHardy wrote:
quoted hunk ↗ jump to hunk
Patrick McHardy wrote:quoted
tcf_dump_walker() doesn't save the number of skipped entries, but the last order dumped, so it could dump the same entries again and again when they exceed the room in the skb.How about this patch? It fixes two problems: - off-by-one while skipping entries: index is incremented before the comparison with s_i, so it will start dumping at entry s_i-1 instead of s_i - problem described above. n_i doesn't include how many empty hash chains were skipped, so adding it to cb->args[0] is incorrect Regards Patrick ______________________________________________________________________ ===== include/net/pkt_act.h 1.10 vs edited =====--- 1.10/include/net/pkt_act.h 2005-01-10 22:54:01 +01:00 +++ edited/include/net/pkt_act.h 2005-03-25 20:58:28 +01:00@@ -102,20 +102,21 @@ p = tcf_ht[tcf_hash(i)]; for (; p; p = p->next) { - index++; - if (index < s_i) + if (index < s_i) { + index++; continue; + } a->priv = p; a->order = n_i; r = (struct rtattr*) skb->tail; RTA_PUT(skb, a->order, 0, NULL); err = tcf_action_dump_1(skb, a, 0, 0); if (0 > err) { - index--; skb_trim(skb, (u8*)r - skb->data); goto done; } r->rta_len = skb->tail - (u8*)r; + index++; n_i++; if (n_i >= TCA_ACT_MAX_PRIO) { goto done;@@ -124,8 +125,7 @@ } done: read_unlock(&tcf_t_lock); - if (n_i) - cb->args[0] += n_i; + cb->args[0] = index; return n_i; rtattr_failure: