Rule counter update bug in ebtables-v2.0.10-2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I was doing some testing with the latest ebtables and I think I've found a bug in ebt_deliver_counters that was introduced in the following commit:

http://ebtables.cvs.sourceforge.net/viewvc/ebtables/ebtables2/userspace/ebtables2/communication.c?r1=1.40&r2=1.41

It seems that the chainnr++ on line 308 is only reached when entries is NULL, causing the code to repeatedly loop over the rules for the first non-empty chain. This manifests as every chain having its counters copied from the first non-empty chain instead of getting the counters assigned with -c:

ebtables -t nat -N CHAIN1
ebtables -t nat -A CHAIN1 -s 0:0:0:0:1:1 -j ACCEPT -c 101 101
ebtables -t nat -A CHAIN1 -s 0:0:0:0:1:2 -j ACCEPT -c 102 102
ebtables -t nat -N CHAIN2
ebtables -t nat -A CHAIN2 -s 0:0:0:0:2:1 -j ACCEPT -c 201 201
ebtables -t nat -A CHAIN2 -s 0:0:0:0:2:2 -j ACCEPT -c 202 202
ebtables -t nat -N CHAIN3
ebtables -t nat -A CHAIN3 -s 0:0:0:0:3:1 -j ACCEPT -c 302 302
ebtables -t nat -A CHAIN3 -s 0:0:0:0:3:2 -j ACCEPT -c 303 303
ebtables -t nat -L --Lc

	Bridge table: nat

	Bridge chain: PREROUTING, entries: 0, policy: ACCEPT

	Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

	Bridge chain: POSTROUTING, entries: 0, policy: ACCEPT

	Bridge chain: CHAIN1, entries: 2, policy: ACCEPT
	-s 0:0:0:0:1:1 -j ACCEPT , pcnt = 101 -- bcnt = 101
	-s 0:0:0:0:1:2 -j ACCEPT , pcnt = 102 -- bcnt = 102

	Bridge chain: CHAIN2, entries: 2, policy: ACCEPT
	-s 0:0:0:0:2:1 -j ACCEPT , pcnt = 101 -- bcnt = 101
	-s 0:0:0:0:2:2 -j ACCEPT , pcnt = 102 -- bcnt = 102

	Bridge chain: CHAIN3, entries: 2, policy: ACCEPT
	-s 0:0:0:0:3:1 -j ACCEPT , pcnt = 101 -- bcnt = 101
	-s 0:0:0:0:3:2 -j ACCEPT , pcnt = 102 -- bcnt = 102

I've attempted to fix the bug, and my patch is included below. I tried to account for all of the edge cases, but I don't have a solid enough understanding of the data structures used to claim that I've been successful. My code is on GitHub as well if that's easier:

https://github.com/irgeek/ebtables/commit/29221fea0021795a7005d17288b656bf21519e84

diff --git a/communication.c b/communication.c
index 0917f6e..f1a6f08 100644
--- a/communication.c
+++ b/communication.c
@@ -308,13 +308,14 @@ void ebt_deliver_counters(struct ebt_u_replace *u_repl)
 	old = u_repl->counters;
 	new = newcounters;
 	while (cc != u_repl->cc) {
-		if (!next || next == entries->entries) {
-			while (chainnr < u_repl->num_chains && (!(entries = u_repl->chains[chainnr]) ||
-			       (next = entries->entries->next) == entries->entries))
-				chainnr++;
-			if (chainnr == u_repl->num_chains)
-				break;
+		while (!next || (next == entries->entries && chainnr < u_repl->num_chains)) {
+			next = NULL;
+			if ((entries = u_repl->chains[chainnr++])) {
+				next = entries->entries->next;
+			}
 		}
+		if (chainnr >= u_repl->num_chains && (!entries || next == entries->entries))
+			break;
 		if (next == NULL)
 			ebt_print_bug("next == NULL");
 		if (cc->type == CNT_NORM) {


James Sinclair
Linode, LLC
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux