diff mbox series

[net] netns: fix NLM_F_ECHO mechanism for RTM_NEWNSID

Message ID 20191007115835.17882-1-nicolas.dichtel@6wind.com
State Changes Requested
Delegated to: David Miller
Headers show
Series [net] netns: fix NLM_F_ECHO mechanism for RTM_NEWNSID | expand

Commit Message

Nicolas Dichtel Oct. 7, 2019, 11:58 a.m. UTC
The flag NLM_F_ECHO aims to reply to the user the message notified to all
listeners.
It was not the case with the command RTM_NEWNSID, let's fix this.

Fixes: 0c7aecd4bde4 ("netns: add rtnl cmd to add and get peer netns ids")
Reported-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
---
 net/core/net_namespace.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

Comments

Guillaume Nault Oct. 8, 2019, 11:10 p.m. UTC | #1
On Mon, Oct 07, 2019 at 01:58:35PM +0200, Nicolas Dichtel wrote:
> The flag NLM_F_ECHO aims to reply to the user the message notified to all
> listeners.
> It was not the case with the command RTM_NEWNSID, let's fix this.
> 
> Fixes: 0c7aecd4bde4 ("netns: add rtnl cmd to add and get peer netns ids")
> Reported-by: Guillaume Nault <gnault@redhat.com>
> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
> ---
>  net/core/net_namespace.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
> index a0e0d298c991..f496ce0e8da8 100644
> --- a/net/core/net_namespace.c
> +++ b/net/core/net_namespace.c
> -static void rtnl_net_notifyid(struct net *net, int cmd, int id)
> +static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid,
> +			      struct nlmsghdr *nlh)
>  {
>  	struct net_fill_args fillargs = {
>  		.cmd = cmd,

We also need to set .portid and .seq otherwise rtnl_net_fill() builds
a netlink message with invalid port id and sequence number (as you
noted in your previous message).
Nicolas Dichtel Oct. 9, 2019, 8:07 a.m. UTC | #2
Le 09/10/2019 à 01:10, Guillaume Nault a écrit :
[snip]
> We also need to set .portid and .seq otherwise rtnl_net_fill() builds
> a netlink message with invalid port id and sequence number (as you
> noted in your previous message).
> 
Yes you're right. I don't know why, I had in mind that nl msg sent by the kernel
should have the portid and seq number set to 0.
Will send a v2.


Thank you,
Nicolas
Guillaume Nault Oct. 9, 2019, 1:48 p.m. UTC | #3
On Wed, Oct 09, 2019 at 10:07:56AM +0200, Nicolas Dichtel wrote:
> Le 09/10/2019 à 01:10, Guillaume Nault a écrit :
> [snip]
> > We also need to set .portid and .seq otherwise rtnl_net_fill() builds
> > a netlink message with invalid port id and sequence number (as you
> > noted in your previous message).
> > 
> Yes you're right. I don't know why, I had in mind that nl msg sent by the kernel
> should have the portid and seq number set to 0.
> Will send a v2.
> 
I guess this idea comes from the fact that portid and seq don't carry
any meaningful information when the message is sent to a multicast
group.
diff mbox series

Patch

diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index a0e0d298c991..f496ce0e8da8 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -245,7 +245,8 @@  static int __peernet2id(struct net *net, struct net *peer)
 	return __peernet2id_alloc(net, peer, &no);
 }
 
-static void rtnl_net_notifyid(struct net *net, int cmd, int id);
+static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid,
+			      struct nlmsghdr *nlh);
 /* This function returns the id of a peer netns. If no id is assigned, one will
  * be allocated and returned.
  */
@@ -268,7 +269,7 @@  int peernet2id_alloc(struct net *net, struct net *peer)
 	id = __peernet2id_alloc(net, peer, &alloc);
 	spin_unlock_bh(&net->nsid_lock);
 	if (alloc && id >= 0)
-		rtnl_net_notifyid(net, RTM_NEWNSID, id);
+		rtnl_net_notifyid(net, RTM_NEWNSID, id, 0, NULL);
 	if (alive)
 		put_net(peer);
 	return id;
@@ -532,7 +533,7 @@  static void unhash_nsid(struct net *net, struct net *last)
 			idr_remove(&tmp->netns_ids, id);
 		spin_unlock_bh(&tmp->nsid_lock);
 		if (id >= 0)
-			rtnl_net_notifyid(tmp, RTM_DELNSID, id);
+			rtnl_net_notifyid(tmp, RTM_DELNSID, id, 0, NULL);
 		if (tmp == last)
 			break;
 	}
@@ -764,7 +765,8 @@  static int rtnl_net_newid(struct sk_buff *skb, struct nlmsghdr *nlh,
 	err = alloc_netid(net, peer, nsid);
 	spin_unlock_bh(&net->nsid_lock);
 	if (err >= 0) {
-		rtnl_net_notifyid(net, RTM_NEWNSID, err);
+		rtnl_net_notifyid(net, RTM_NEWNSID, err, NETLINK_CB(skb).portid,
+				  nlh);
 		err = 0;
 	} else if (err == -ENOSPC && nsid >= 0) {
 		err = -EEXIST;
@@ -1051,7 +1053,8 @@  static int rtnl_net_dumpid(struct sk_buff *skb, struct netlink_callback *cb)
 	return err < 0 ? err : skb->len;
 }
 
-static void rtnl_net_notifyid(struct net *net, int cmd, int id)
+static void rtnl_net_notifyid(struct net *net, int cmd, int id, u32 portid,
+			      struct nlmsghdr *nlh)
 {
 	struct net_fill_args fillargs = {
 		.cmd = cmd,
@@ -1068,7 +1071,7 @@  static void rtnl_net_notifyid(struct net *net, int cmd, int id)
 	if (err < 0)
 		goto err_out;
 
-	rtnl_notify(msg, net, 0, RTNLGRP_NSID, NULL, 0);
+	rtnl_notify(msg, net, portid, RTNLGRP_NSID, nlh, 0);
 	return;
 
 err_out: