Subject: Re: [Bugme-new] [Bug 31232] New: /proc/sys/net/ipv6 has two neigh folders

From: [email-masked] (Eric W. Biederman)
Date: Wed, 16 Mar 2011 20:55:59 -0700

Andrew Morton <[email-masked]> writes:

> (switched to email.  Please respond via emailed reply-to-all, not via the
> bugzilla web interface).
>
> On Wed, 16 Mar 2011 22:06:34 GMT
> [email-masked] wrote:
>
>> https://bugzilla.kernel.org/show_bug.cgi?id=31232
>> 
>>            Summary: /proc/sys/net/ipv6 has two neigh folders
>>            Product: Networking
>>            Version: 2.5
>>     Kernel Version: 2.6.38
>>           Platform: All
>>         OS/Version: Linux
>>               Tree: Mainline
>>             Status: NEW
>>           Severity: low
>>           Priority: P1
>>          Component: IPV6
>>         AssignedTo: [email-masked]
>>         ReportedBy: [email-masked]
>>         Regression: No
>> 
>> 
>> I noticed when looking for other things that there are two neigh folders in
>> /proc/sys/net/ipv6
>> 
>> Reverting this commit removes the extra neigh folder:
>> http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commitdiff;h=bf36076a67db6d7423d09d861a072337866f0dd9
>> 
>> I don't know how to fix this.
>> I tried removing the ',' on the row '.child = empty,' (looking at the other
>> rows it did seem like a typo to me).
>> 
>> This did not change anything that I could see though.
>> 
>> Here is the commit I believe introduced the bug: 

Interesting.

This is definitely a bug.  I suspect it may be another symptom of the
bug I was trying to fix.  Something somewhere is messed up with the
neigh directory.

That extra neigh entry should serve as a mount point for any later neigh
entries that are registered, so the change should be fine.

I will see if I can make the time to look into this, as this new symptom
looks as nasty as the use after free problems I was seeing earlier.

Eric

>> --- a/net/ipv6/sysctl_net_ipv6.c
>> +++ b/net/ipv6/sysctl_net_ipv6.c
>> @@ -15,6 +15,8 @@
>>  #include <net/addrconf.h>
>>  #include <net/inet_frag.h>
>> 
>> +static struct ctl_table empty[1];
>> +
>>  static ctl_table ipv6_table_template[] = {
>>         {
>>                 .procname       = "route",
>> @@ -35,6 +37,12 @@ static ctl_table ipv6_table_template[] = {
>>                 .mode           = 0644,
>>                 .proc_handler   = proc_dointvec
>>         },
>> +       {
>> +               .procname       = "neigh",
>> +               .maxlen         = 0,
>> +               .mode           = 0555,
>> +               .child          = empty,
>> +       },
>>         { }
>>  };
>> 
>> @@ -152,7 +160,6 @@ static struct ctl_table_header *ip6_base;
>> 
>>  int ipv6_static_sysctl_register(void)
>>  {
>> -       static struct ctl_table empty[1];
>>         ip6_base = register_sysctl_paths(net_ipv6_ctl_path, empty);
>>         if (ip6_base == NULL)
>>                 return -ENOMEM;
>>