]> git.baikalelectronics.ru Git - kernel.git/commit
net/ipv6: fix addrconf_sysctl_addr_gen_mode
authorSabrina Dubroca <sd@queasysnail.net>
Mon, 9 Jul 2018 10:25:14 +0000 (12:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Jul 2018 05:50:45 +0000 (22:50 -0700)
commitd47942c21e9f9b831cd42a7c99ff17a7a25de323
tree18bd5526b9e09090fc8b128ce3437f987e56d712
parenta11a3abb00a911f5198253206f96345b47673f0c
net/ipv6: fix addrconf_sysctl_addr_gen_mode

addrconf_sysctl_addr_gen_mode() has multiple problems. First, it ignores
the errors returned by proc_dointvec().

addrconf_sysctl_addr_gen_mode() calls proc_dointvec() directly, which
writes the value to memory, and then checks if it's valid and may return
EINVAL. If a bad value is given, the value displayed when reading
net.ipv6.conf.foo.addr_gen_mode next time will be invalid. In case the
value provided by the user was valid, addrconf_dev_config() won't be
called since idev->cnf.addr_gen_mode has already been updated.

Fix this in the usual way we deal with values that need to be checked
after the proc_do*() helper has returned: define a local ctl_table and
storage, call proc_dointvec() on that temporary area, then check and
store.

addrconf_sysctl_addr_gen_mode() also writes the new value to the global
ipv6_devconf_dflt, when we're writing to some netns's default, so that
new netns will inherit the value that was set by the change occuring in
any netns. That doesn't make any sense, so let's drop this assignment.

Finally, since addr_gen_mode is a __u32, switch to proc_douintvec().

Fixes: 87112f6f21f6 ("net/ipv6: allow sysctl to change link-local address generation mode")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c