diff options
| author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2021-04-23 21:53:47 +0000 |
|---|---|---|
| committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2021-05-04 21:29:36 +0000 |
| commit | 3fd9848f15930d5ddde4375e540045cc4dc214d6 (patch) | |
| tree | 9a555b8d38be89a89400e59250041f3f25e4bf15 | |
| parent | d6d039ea74a26357173d1263682d4f5119037434 (diff) | |
[rtsock] Enforce netmask/RTF_HOST consistency.
Traditionally we had 2 sources of information whether the
added/delete route request targets network or a host route:
netmask (RTA_NETMASK) and RTF_HOST flag.
The former one is tricky: netmask can be empty or can explicitly
specify the host netmask. Parsing netmask sockaddr requires per-family
parsing and that's what rtsock code traditionally avoided. As a result,
consistency was not enforced and it was possible to specify network with
the RTF_HOST flag and vice versa.
Continue normalization efforts from D29826 and D29826 and ensure that
RTF_HOST flag always reflects host/network data from netmask field.
Differential Revision: https://reviews.freebsd.org/D29958
MFC after: 2 days
(cherry picked from commit 5d1403a79a3e56403fb63c062252a23fce81e5f1)
| -rw-r--r-- | sys/net/rtsock.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 405300a394de..6930bd167ac1 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1503,6 +1503,7 @@ cleanup_xaddrs_inet(struct rt_addrinfo *info, struct linear_buffer *lb) return (ENOBUFS); fill_sockaddr_inet(mask_sa, mask); info->rti_info[RTAX_NETMASK] = (struct sockaddr *)mask_sa; + info->rti_flags &= ~RTF_HOST; } else remove_netmask(info); @@ -1563,6 +1564,7 @@ cleanup_xaddrs_inet6(struct rt_addrinfo *info, struct linear_buffer *lb) return (ENOBUFS); fill_sockaddr_inet6((struct sockaddr_in6 *)sa, &mask, 0); info->rti_info[RTAX_NETMASK] = sa; + info->rti_flags &= ~RTF_HOST; } else remove_netmask(info); |
