All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: netdev@vger.kernel.org
Cc: Jamal Hadi Salim <jhs@mojatatu.com>,
	Cong Wang <xiyou.wangcong@gmail.com>,
	Jiri Pirko <jiri@resnulli.us>
Subject: [PATCH net 02/13] net: sched: cls_u32: mark root hnode explicitly
Date: Sun,  9 Sep 2018 02:31:21 +0100	[thread overview]
Message-ID: <20180909013132.3222-3-viro@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20180909013132.3222-1-viro@ZenIV.linux.org.uk>

From: Al Viro <viro@zeniv.linux.org.uk>

... and produce consistent error on attempt to delete such.
Existing check in u32_delete() is inconsistent - after

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip prio 100 handle 1: u32 divisor 1
tc filter add dev eth0 parent ffff: protocol ip prio 200 handle 2: u32 divisor 1

both

tc filter delete dev eth0 parent ffff: protocol ip prio 100 handle 801: u32

and

tc filter delete dev eth0 parent ffff: protocol ip prio 100 handle 800: u32

will fail (at least with refcounting fixes), but the former will complain
about an attempt to remove a busy table, while the latter will recognize
it as root and yield "Not allowed to delete root node" instead.

The problem with the existing check is that several tcf_proto instances might
share the same tp->data and handle-to-hnode lookup will be the same for all
of them.  So comparing an hnode to be deleted with tp->root won't catch the
case when one tp is used to try deleting the root of another.  Solution is
trivial - mark the root hnodes explicitly upon allocation and check for that.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 net/sched/cls_u32.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index b2c3406a2cf2..c4782aa808c7 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -84,6 +84,7 @@ struct tc_u_hnode {
 	int			refcnt;
 	unsigned int		divisor;
 	struct idr		handle_idr;
+	bool			is_root;
 	struct rcu_head		rcu;
 	u32			flags;
 	/* The 'ht' field MUST be the last field in structure to allow for
@@ -377,6 +378,7 @@ static int u32_init(struct tcf_proto *tp)
 	root_ht->refcnt++;
 	root_ht->handle = tp_c ? gen_new_htid(tp_c, root_ht) : 0x80000000;
 	root_ht->prio = tp->prio;
+	root_ht->is_root = true;
 	idr_init(&root_ht->handle_idr);
 
 	if (tp_c == NULL) {
@@ -693,7 +695,7 @@ static int u32_delete(struct tcf_proto *tp, void *arg, bool *last,
 		goto out;
 	}
 
-	if (root_ht == ht) {
+	if (ht->is_root) {
 		NL_SET_ERR_MSG_MOD(extack, "Not allowed to delete root node");
 		return -EINVAL;
 	}
-- 
2.11.0

  parent reply	other threads:[~2018-09-09  6:20 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-09  1:31 [PATCH net 00/13] cls_u32 cleanups and fixes Al Viro
2018-09-09  1:31 ` [PATCH net 01/13] net: sched: cls_u32: fix hnode refcounting Al Viro
2018-09-09 11:37   ` Jamal Hadi Salim
2018-09-09 11:37     ` Jamal Hadi Salim
2018-09-09  1:31 ` Al Viro [this message]
2018-09-09 11:39   ` [PATCH net 02/13] net: sched: cls_u32: mark root hnode explicitly Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 03/13] net: sched: cls_u32: disallow linking to root hnode Al Viro
2018-09-09 11:39   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 04/13] net: sched: cls_u32: make sure that divisor is a power of 2 Al Viro
2018-09-09 11:41   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 05/13] net: sched: cls_u32: get rid of unused argument of u32_destroy_key() Al Viro
2018-09-09 11:41   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 06/13] net: sched: cls_u32: get rid of tc_u_knode ->tp Al Viro
2018-09-09 11:43   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 07/13] net: sched: cls_u32: get rid of tc_u_common ->rcu Al Viro
2018-09-09 11:45   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 08/13] net: sched: cls_u32: clean tc_u_common hashtable Al Viro
2018-09-09 11:47   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 09/13] net: sched: cls_u32: pass tc_u_common to u32_set_parms() instead of tc_u_hnode Al Viro
2018-09-09 11:52   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 10/13] net: sched: cls_u32: the tp_c argument of u32_set_parms() is always tp->data Al Viro
2018-09-09 12:48   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 11/13] net: sched: cls_u32: get rid of hnode ->tp_c and tp_c argument of u32_set_parms() Al Viro
2018-09-09 12:49   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 12/13] net: sched: cls_u32: keep track of knodes count in tc_u_common Al Viro
2018-09-09 12:50   ` Jamal Hadi Salim
2018-09-09  1:31 ` [PATCH net 13/13] net: sched: cls_u32: simplify the hell out u32_delete() emptiness check Al Viro
2018-09-09 12:51   ` Jamal Hadi Salim
2018-09-09 12:58 ` [PATCH net 00/13] cls_u32 cleanups and fixes Jamal Hadi Salim
2018-09-09 14:15   ` Al Viro
2018-09-09 15:48     ` Al Viro
2018-09-10 12:25       ` Offloaded u32 classifier tables WAS (Re: " Jamal Hadi Salim
2018-09-10 12:31         ` Jamal Hadi Salim
2018-09-10 11:30     ` Jamal Hadi Salim
2018-09-12  6:15 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180909013132.3222-3-viro@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=netdev@vger.kernel.org \
    --cc=xiyou.wangcong@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.