aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_api.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-11-15 22:03:00 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-18 20:32:44 -0500
commitdfc47ef8639facd77210e74be831943c2fdd9c74 (patch)
tree5c7e9f93a999bf1d38b216af346ce2159e5f18ec /net/sched/sch_api.c
parent464dc801c76aa0db88e16e8f5f47c6879858b9b2 (diff)
net: Push capable(CAP_NET_ADMIN) into the rtnl methods
- In rtnetlink_rcv_msg convert the capable(CAP_NET_ADMIN) check to ns_capable(net->user-ns, CAP_NET_ADMIN). Allowing unprivileged users to make netlink calls to modify their local network namespace. - In the rtnetlink doit methods add capable(CAP_NET_ADMIN) so that calls that are not safe for unprivileged users are still protected. Later patches will remove the extra capable calls from methods that are safe for unprivilged users. Acked-by: Serge Hallyn <serge.hallyn@canonical.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r--net/sched/sch_api.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 13cc744a2498..4799c4840c1a 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -980,6 +980,9 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
980 struct Qdisc *p = NULL; 980 struct Qdisc *p = NULL;
981 int err; 981 int err;
982 982
983 if ((n->nlmsg_type != RTM_GETQDISC) && !capable(CAP_NET_ADMIN))
984 return -EPERM;
985
983 dev = __dev_get_by_index(net, tcm->tcm_ifindex); 986 dev = __dev_get_by_index(net, tcm->tcm_ifindex);
984 if (!dev) 987 if (!dev)
985 return -ENODEV; 988 return -ENODEV;
@@ -1043,6 +1046,9 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
1043 struct Qdisc *q, *p; 1046 struct Qdisc *q, *p;
1044 int err; 1047 int err;
1045 1048
1049 if (!capable(CAP_NET_ADMIN))
1050 return -EPERM;
1051
1046replay: 1052replay:
1047 /* Reinit, just in case something touches this. */ 1053 /* Reinit, just in case something touches this. */
1048 tcm = nlmsg_data(n); 1054 tcm = nlmsg_data(n);
@@ -1379,6 +1385,9 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
1379 u32 qid = TC_H_MAJ(clid); 1385 u32 qid = TC_H_MAJ(clid);
1380 int err; 1386 int err;
1381 1387
1388 if ((n->nlmsg_type != RTM_GETTCLASS) && !capable(CAP_NET_ADMIN))
1389 return -EPERM;
1390
1382 dev = __dev_get_by_index(net, tcm->tcm_ifindex); 1391 dev = __dev_get_by_index(net, tcm->tcm_ifindex);
1383 if (!dev) 1392 if (!dev)
1384 return -ENODEV; 1393 return -ENODEV;