From: ebiederm@xmission.com (Eric W. Biederman)
To: Gao feng <gaofeng@cn.fujitsu.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org
Subject: Re: [PATCH RESEND 1/2] neigh: only allow init_net to change the default neigh_parms
Date: Wed, 12 Jun 2013 00:33:54 -0700 [thread overview]
Message-ID: <87ehc7rdel.fsf@xmission.com> (raw)
In-Reply-To: <1371012275-31735-1-git-send-email-gaofeng@cn.fujitsu.com> (Gao feng's message of "Wed, 12 Jun 2013 12:44:34 +0800")
Gao feng <gaofeng@cn.fujitsu.com> writes:
> Though we don't export the /proc/sys/net/ipv[4,6]/neigh/default/
> directory to the un-init_net, but we can still use cmd such as
> "ip ntable change name arp_cache locktime 129" to change the locktime
> of default neigh_parms.
>
> This patch disallows the un-init_net to find out the neigh_table.parms.
> So the un-init_net will failed to influence the init_net.
Interesting...
The problem these two patches seek to address seems legit.
However I disagree with the way you are handling this.
Outside of the initial network namespace we should return -ENOENT
instead of -EPERM. Which would match how we handle sysctls, and I think
missing neigh table values. Just not making these global values visible
seems wise.
The alternative is to use the proper permission test which is
capable(CAP_SYS_ADMIN) (instead of testing network namespaces) and
return -EPERM if that fails. Which would allow processes in other
network namespaces to change the value if they could otherwise change
the value.
Namespaces are about visibility and there is no need to make an
exception here.
Eric
> Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
> ---
> net/core/neighbour.c | 25 ++++++++++++++-----------
> 1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/net/core/neighbour.c b/net/core/neighbour.c
> index 5c56b21..e4027ff 100644
> --- a/net/core/neighbour.c
> +++ b/net/core/neighbour.c
> @@ -1418,26 +1418,29 @@ static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl,
> struct neigh_parms *p;
>
> for (p = &tbl->parms; p; p = p->next) {
> - if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
> - (!p->dev && !ifindex))
> + if (p->dev && p->dev->ifindex == ifindex &&
> + net_eq(neigh_parms_net(p), net))
> return p;
> +
> + if (!p->dev && !ifindex) {
> + if (net_eq(net, &init_net))
> + return p;
> + else
> + return ERR_PTR(-EPERM);
> + }
> }
>
> - return NULL;
> + return ERR_PTR(-ENOENT);
> }
>
> struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
> struct neigh_table *tbl)
> {
> - struct neigh_parms *p, *ref;
> + struct neigh_parms *p;
> struct net *net = dev_net(dev);
> const struct net_device_ops *ops = dev->netdev_ops;
>
> - ref = lookup_neigh_parms(tbl, net, 0);
> - if (!ref)
> - return NULL;
> -
> - p = kmemdup(ref, sizeof(*p), GFP_KERNEL);
> + p = kmemdup(&tbl->parms, sizeof(*p), GFP_KERNEL);
> if (p) {
> p->tbl = tbl;
> atomic_set(&p->refcnt, 1);
> @@ -1999,8 +2002,8 @@ static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh)
> ifindex = nla_get_u32(tbp[NDTPA_IFINDEX]);
>
> p = lookup_neigh_parms(tbl, net, ifindex);
> - if (p == NULL) {
> - err = -ENOENT;
> + if (IS_ERR(p)) {
> + err = PTR_ERR(p);
> goto errout_tbl_lock;
> }
next prev parent reply other threads:[~2013-06-12 7:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-12 4:44 [PATCH RESEND 1/2] neigh: only allow init_net to change the default neigh_parms Gao feng
2013-06-12 4:44 ` [PATCH RESEND 2/2] neigh: disallow un-init_net to change thresh of neigh Gao feng
2013-06-12 7:33 ` Eric W. Biederman [this message]
2013-06-13 1:17 ` [PATCH RESEND 1/2] neigh: only allow init_net to change the default neigh_parms Gao feng
2013-06-13 1:27 ` Eric W. Biederman
2013-06-13 3:44 ` Gao feng
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=87ehc7rdel.fsf@xmission.com \
--to=ebiederm@xmission.com \
--cc=davem@davemloft.net \
--cc=gaofeng@cn.fujitsu.com \
--cc=netdev@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).