Module Name: src Committed By: ozaki-r Date: Wed Oct 16 07:41:28 UTC 2019
Modified Files: src/sys/netinet6: ip6_input.c Log Message: Validate ip6_temp_preferred_lifetime (net.inet6.ip6.temppltime) on a change ip6_temp_preferred_lifetime is used to calculate an interval period to regenerate temporary addresse by TEMP_PREFERRED_LIFETIME - REGEN_ADVANCE - DESYNC_FACTOR as per RFC 3041 3.5. So it must be greater than (REGEN_ADVANCE + DESYNC_FACTOR), otherwise it will be negative and go wrong, for example KASSERT(to_ticks >= 0) in callout_schedule_locked fails. To generate a diff of this commit: cvs rdiff -u -r1.212 -r1.213 src/sys/netinet6/ip6_input.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet6/ip6_input.c diff -u src/sys/netinet6/ip6_input.c:1.212 src/sys/netinet6/ip6_input.c:1.213 --- src/sys/netinet6/ip6_input.c:1.212 Wed Oct 16 07:40:40 2019 +++ src/sys/netinet6/ip6_input.c Wed Oct 16 07:41:28 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ip6_input.c,v 1.212 2019/10/16 07:40:40 ozaki-r Exp $ */ +/* $NetBSD: ip6_input.c,v 1.213 2019/10/16 07:41:28 ozaki-r Exp $ */ /* $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.212 2019/10/16 07:40:40 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.213 2019/10/16 07:41:28 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_gateway.h" @@ -1531,6 +1531,28 @@ sysctl_net_inet6_ip6_stats(SYSCTLFN_ARGS return (NETSTAT_SYSCTL(ip6stat_percpu, IP6_NSTATS)); } +static int +sysctl_net_inet6_ip6_temppltime(SYSCTLFN_ARGS) +{ + int error; + uint32_t pltime; + struct sysctlnode node; + + node = *rnode; + node.sysctl_data = &pltime; + pltime = ip6_temp_preferred_lifetime; + error = sysctl_lookup(SYSCTLFN_CALL(&node)); + if (error || newp == NULL) + return error; + + if (pltime <= (MAX_TEMP_DESYNC_FACTOR + TEMPADDR_REGEN_ADVANCE)) + return EINVAL; + + ip6_temp_preferred_lifetime = pltime; + + return 0; +} + static void sysctl_net_inet6_ip6_setup(struct sysctllog **clog) { @@ -1742,7 +1764,7 @@ sysctl_net_inet6_ip6_setup(struct sysctl CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, "temppltime", SYSCTL_DESCR("preferred lifetime of a temporary address"), - NULL, 0, &ip6_temp_preferred_lifetime, 0, + sysctl_net_inet6_ip6_temppltime, 0, NULL, 0, CTL_NET, PF_INET6, IPPROTO_IPV6, CTL_CREATE, CTL_EOL); sysctl_createv(clog, 0, NULL, NULL,