[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220818035227.81567-15-kuniyu@amazon.com>
Date: Wed, 17 Aug 2022 20:52:24 -0700
From: Kuniyuki Iwashima <kuniyu@...zon.com>
To: "David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>
CC: Kuniyuki Iwashima <kuniyu@...zon.com>,
Kuniyuki Iwashima <kuni1840@...il.com>,
<netdev@...r.kernel.org>, Cong Wang <xiyou.wangcong@...il.com>
Subject: [PATCH v2 net 14/17] net: Fix data-races around sysctl_devconf_inherit_init_net.
While reading sysctl_devconf_inherit_init_net, it can be changed
concurrently. Thus, we need to add READ_ONCE() to its readers.
Fixes: 856c395cfa63 ("net: introduce a knob to control whether to inherit devconf config")
Signed-off-by: Kuniyuki Iwashima <kuniyu@...zon.com>
---
CC: Cong Wang <xiyou.wangcong@...il.com>
---
net/ipv4/devinet.c | 6 ++++--
net/ipv6/addrconf.c | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 92b778e423df..e92428f44f9b 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -2682,8 +2682,10 @@ static __net_init int devinet_init_net(struct net *net)
#endif
if (!net_eq(net, &init_net)) {
+ int devconf_inherit_init_net = READ_ONCE(sysctl_devconf_inherit_init_net);
+
if (IS_ENABLED(CONFIG_SYSCTL) &&
- sysctl_devconf_inherit_init_net == 3) {
+ devconf_inherit_init_net == 3) {
/* copy from the current netns */
memcpy(all, current->nsproxy->net_ns->ipv4.devconf_all,
sizeof(ipv4_devconf));
@@ -2691,7 +2693,7 @@ static __net_init int devinet_init_net(struct net *net)
current->nsproxy->net_ns->ipv4.devconf_dflt,
sizeof(ipv4_devconf_dflt));
} else if (!IS_ENABLED(CONFIG_SYSCTL) ||
- sysctl_devconf_inherit_init_net != 2) {
+ devconf_inherit_init_net != 2) {
/* inherit == 0 or 1: copy from init_net */
memcpy(all, init_net.ipv4.devconf_all,
sizeof(ipv4_devconf));
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index b624e3d8c5f0..ac55b02bbe22 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -7164,7 +7164,7 @@ static int __net_init addrconf_init_net(struct net *net)
if (IS_ENABLED(CONFIG_SYSCTL) &&
!net_eq(net, &init_net)) {
- switch (sysctl_devconf_inherit_init_net) {
+ switch (READ_ONCE(sysctl_devconf_inherit_init_net)) {
case 1: /* copy from init_net */
memcpy(all, init_net.ipv6.devconf_all,
sizeof(ipv6_devconf));
--
2.30.2
Powered by blists - more mailing lists