* [PATCH] net: Fix userspace RTM_NEWLINK notifications.
@ 2009-12-13 8:11 Eric W. Biederman
2009-12-14 2:05 ` Marcel Holtmann
2009-12-14 3:45 ` [PATCH] " David Miller
0 siblings, 2 replies; 5+ messages in thread
From: Eric W. Biederman @ 2009-12-13 8:11 UTC (permalink / raw)
To: David Miller; +Cc: netdev, stable
I received some bug reports about userspace programs having problems
because after RTM_NEWLINK was received they could not immediate access
files under /proc/sys/net/ because they had not been registered yet.
The original problem was trivially fixed by moving the userspace
notification from rtnetlink_event() to the end of
register_netdevice().
When testing that change I discovered I was still getting RTM_NEWLINK
events before I could access proc and I was also getting RTM_NEWLINK
events after I was seeing RTM_DELLINK. Things practically guaranteed
to confuse userspace.
After a little more investigation these extra notifications proved to
be from the new notifiers NETDEV_POST_INIT and NETDEV_UNREGISTER_BATCH
hitting the default case in rtnetlink_event, and triggering
unnecessary RTM_NEWLINK messages.
rtnetlink_event now explicitly handles NETDEV_UNREGISTER_BATCH and
NETDEV_POST_INIT to avoid sending the incorrect userspace
notifications.
Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
---
net/core/dev.c | 11 +++++++++++
net/core/rtnetlink.c | 6 +++---
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index c36a17a..369e83a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5033,6 +5033,11 @@ int register_netdevice(struct net_device *dev)
rollback_registered(dev);
dev->reg_state = NETREG_UNREGISTERED;
}
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
out:
return ret;
@@ -5595,6 +5600,12 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
/* Notify protocols, that a new device appeared. */
call_netdevice_notifiers(NETDEV_REGISTER, dev);
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
+
synchronize_net();
err = 0;
out:
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 33148a5..794bcb8 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1364,15 +1364,15 @@ static int rtnetlink_event(struct notifier_block *this, unsigned long event, voi
case NETDEV_UNREGISTER:
rtmsg_ifinfo(RTM_DELLINK, dev, ~0U);
break;
- case NETDEV_REGISTER:
- rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
- break;
case NETDEV_UP:
case NETDEV_DOWN:
rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING);
break;
+ case NETDEV_POST_INIT:
+ case NETDEV_REGISTER:
case NETDEV_CHANGE:
case NETDEV_GOING_DOWN:
+ case NETDEV_UNREGISTER_BATCH:
break;
default:
rtmsg_ifinfo(RTM_NEWLINK, dev, 0);
--
1.6.5.2.143.g8cc62
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] net: Fix userspace RTM_NEWLINK notifications.
2009-12-13 8:11 [PATCH] net: Fix userspace RTM_NEWLINK notifications Eric W. Biederman
@ 2009-12-14 2:05 ` Marcel Holtmann
2009-12-14 3:46 ` David Miller
2009-12-14 3:45 ` [PATCH] " David Miller
1 sibling, 1 reply; 5+ messages in thread
From: Marcel Holtmann @ 2009-12-14 2:05 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: David Miller, netdev, stable
Hi Eric,
> I received some bug reports about userspace programs having problems
> because after RTM_NEWLINK was received they could not immediate access
> files under /proc/sys/net/ because they had not been registered yet.
>
> The original problem was trivially fixed by moving the userspace
> notification from rtnetlink_event() to the end of
> register_netdevice().
>
> When testing that change I discovered I was still getting RTM_NEWLINK
> events before I could access proc and I was also getting RTM_NEWLINK
> events after I was seeing RTM_DELLINK. Things practically guaranteed
> to confuse userspace.
>
> After a little more investigation these extra notifications proved to
> be from the new notifiers NETDEV_POST_INIT and NETDEV_UNREGISTER_BATCH
> hitting the default case in rtnetlink_event, and triggering
> unnecessary RTM_NEWLINK messages.
>
> rtnetlink_event now explicitly handles NETDEV_UNREGISTER_BATCH and
> NETDEV_POST_INIT to avoid sending the incorrect userspace
> notifications.
the POST_INIT and UNREGISTER_BATCH are not 2.6.32 features. They are
2.6.33 features and thus you need to create a separate patch for -stable
if you wanna fix the /proc access issue.
Regards
Marcel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] net: Fix userspace RTM_NEWLINK notifications.
2009-12-13 8:11 [PATCH] net: Fix userspace RTM_NEWLINK notifications Eric W. Biederman
2009-12-14 2:05 ` Marcel Holtmann
@ 2009-12-14 3:45 ` David Miller
1 sibling, 0 replies; 5+ messages in thread
From: David Miller @ 2009-12-14 3:45 UTC (permalink / raw)
To: ebiederm; +Cc: netdev, stable
From: ebiederm@xmission.com (Eric W. Biederman)
Date: Sun, 13 Dec 2009 00:11:15 -0800
>
> I received some bug reports about userspace programs having problems
> because after RTM_NEWLINK was received they could not immediate access
> files under /proc/sys/net/ because they had not been registered yet.
...
> Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
Applied, thanks Eric.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] net: Fix userspace RTM_NEWLINK notifications.
2009-12-14 2:05 ` Marcel Holtmann
@ 2009-12-14 3:46 ` David Miller
2009-12-14 6:39 ` [PATCH v2.6.32] " Eric W. Biederman
0 siblings, 1 reply; 5+ messages in thread
From: David Miller @ 2009-12-14 3:46 UTC (permalink / raw)
To: marcel; +Cc: ebiederm, netdev, stable
From: Marcel Holtmann <marcel@holtmann.org>
Date: Mon, 14 Dec 2009 03:05:36 +0100
> the POST_INIT and UNREGISTER_BATCH are not 2.6.32 features. They are
> 2.6.33 features and thus you need to create a separate patch for -stable
> if you wanna fix the /proc access issue.
Eric, please give me a suitable backport for -stable.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2.6.32] net: Fix userspace RTM_NEWLINK notifications.
2009-12-14 3:46 ` David Miller
@ 2009-12-14 6:39 ` Eric W. Biederman
0 siblings, 0 replies; 5+ messages in thread
From: Eric W. Biederman @ 2009-12-14 6:39 UTC (permalink / raw)
To: David Miller; +Cc: marcel, netdev, stable
I received some bug reports about userspace programs having problems
because after RTM_NEWLINK was received they could not immeidate
access files under /proc/sys/net/ because they had not been
registered yet.
The problem was trivailly fixed by moving the userspace
notification from rtnetlink_event to the end of register_netdevice.
Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
---
This patch is against 2.6.32 and should work back to 2.6.29 and
probably earlier.
net/core/dev.c | 11 +++++++++++
net/core/rtnetlink.c | 4 +---
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index fe10551..584046e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4860,6 +4860,11 @@ int register_netdevice(struct net_device *dev)
rollback_registered(dev);
dev->reg_state = NETREG_UNREGISTERED;
}
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
out:
return ret;
@@ -5398,6 +5403,12 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
/* Notify protocols, that a new device appeared. */
call_netdevice_notifiers(NETDEV_REGISTER, dev);
+ /*
+ * Prevent userspace races by waiting until the network
+ * device is fully setup before sending notifications.
+ */
+ rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
+
synchronize_net();
err = 0;
out:
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index eb42873..d4fd895 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1334,13 +1334,11 @@ static int rtnetlink_event(struct notifier_block *this, unsigned long event, voi
case NETDEV_UNREGISTER:
rtmsg_ifinfo(RTM_DELLINK, dev, ~0U);
break;
- case NETDEV_REGISTER:
- rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
- break;
case NETDEV_UP:
case NETDEV_DOWN:
rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING);
break;
+ case NETDEV_REGISTER:
case NETDEV_CHANGE:
case NETDEV_GOING_DOWN:
break;
--
1.6.5.2.143.g8cc62
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-12-14 6:39 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-13 8:11 [PATCH] net: Fix userspace RTM_NEWLINK notifications Eric W. Biederman
2009-12-14 2:05 ` Marcel Holtmann
2009-12-14 3:46 ` David Miller
2009-12-14 6:39 ` [PATCH v2.6.32] " Eric W. Biederman
2009-12-14 3:45 ` [PATCH] " David Miller
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).