Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d2a8fa9 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by David S. Miller
Browse files

net ipv6: Fix duplicate /proc/sys/net/ipv6/neigh directory entries.

When I was fixing issues with unregisgtering tables under /proc/sys/net/ipv6/neigh
by adding a mount point it appears I missed a critical ordering issue, in the
ipv6 initialization.  I had not realized that ipv6_sysctl_register is called
at the very end of the ipv6 initialization and in particular after we call
neigh_sysctl_register from ndisc_init.

"neigh" needs to be initialized in ipv6_static_sysctl_register which is
the first ipv6 table to initialized, and definitely before ndisc_init.
This removes the weirdness of duplicate tables while still providing a
"neigh" mount point which prevents races in sysctl unregistering.

This was initially reported at https://bugzilla.kernel.org/show_bug.cgi?id=31232


Reported-by: default avatar <sunkan@zappa.cx>
Signed-off-by: default avatarEric W. Biederman <ebiederm@aristanetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d5cd9244
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -17,6 +17,16 @@

static struct ctl_table empty[1];

static ctl_table ipv6_static_skeleton[] = {
	{
		.procname	= "neigh",
		.maxlen		= 0,
		.mode		= 0555,
		.child		= empty,
	},
	{ }
};

static ctl_table ipv6_table_template[] = {
	{
		.procname	= "route",
@@ -37,12 +47,6 @@ static ctl_table ipv6_table_template[] = {
		.mode		= 0644,
		.proc_handler	= proc_dointvec
	},
	{
		.procname	= "neigh",
		.maxlen		= 0,
		.mode		= 0555,
		.child		= empty,
	},
	{ }
};

@@ -160,7 +164,7 @@ static struct ctl_table_header *ip6_base;

int ipv6_static_sysctl_register(void)
{
	ip6_base = register_sysctl_paths(net_ipv6_ctl_path, empty);
	ip6_base = register_sysctl_paths(net_ipv6_ctl_path, ipv6_static_skeleton);
	if (ip6_base == NULL)
		return -ENOMEM;
	return 0;