From 16d196b323a0d10b6814eea2ef50e375dde93b2c Mon Sep 17 00:00:00 2001 From: florian Date: Tue, 16 Apr 2024 14:37:49 +0000 Subject: [PATCH] Destination addresses make no sense on loopback interfaces. While here use (variable & FLAG) or !(variable & FLAG) consistently in in6_update_ifa(). Discussed with claudio OK denis --- sys/netinet6/in6.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 1266354e202..244fb26e093 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6.c,v 1.262 2023/06/28 11:49:49 kn Exp $ */ +/* $OpenBSD: in6.c,v 1.263 2024/04/16 14:37:49 florian Exp $ */ /* $KAME: in6.c,v 1.372 2004/06/14 08:14:21 itojun Exp $ */ /* @@ -565,7 +565,7 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, * The destination address for a p2p link must have a family * of AF_UNSPEC or AF_INET6. */ - if ((ifp->if_flags & IFF_POINTOPOINT) != 0 && + if ((ifp->if_flags & IFF_POINTOPOINT) && ifra->ifra_dstaddr.sin6_family != AF_INET6 && ifra->ifra_dstaddr.sin6_family != AF_UNSPEC) return (EAFNOSUPPORT); @@ -603,19 +603,18 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, * zone identifier. */ dst6 = ifra->ifra_dstaddr; - if ((ifp->if_flags & (IFF_POINTOPOINT|IFF_LOOPBACK)) != 0 && + if ((ifp->if_flags & IFF_POINTOPOINT) && (dst6.sin6_family == AF_INET6)) { error = in6_check_embed_scope(&dst6, ifp->if_index); if (error) return error; } /* - * The destination address can be specified only for a p2p or a - * loopback interface. If specified, the corresponding prefix length - * must be 128. + * The destination address can be specified only for a p2p interface. + * If specified, the corresponding prefix length must be 128. */ if (ifra->ifra_dstaddr.sin6_family == AF_INET6) { - if ((ifp->if_flags & (IFF_POINTOPOINT|IFF_LOOPBACK)) == 0) + if (!(ifp->if_flags & IFF_POINTOPOINT)) return (EINVAL); if (plen != 128) return (EINVAL); @@ -652,7 +651,7 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, ia6->ia_addr.sin6_family = AF_INET6; ia6->ia_addr.sin6_len = sizeof(ia6->ia_addr); ia6->ia6_updatetime = getuptime(); - if ((ifp->if_flags & (IFF_POINTOPOINT | IFF_LOOPBACK)) != 0) { + if (ifp->if_flags & IFF_POINTOPOINT) { /* * XXX: some functions expect that ifa_dstaddr is not * NULL for p2p interfaces. @@ -687,7 +686,7 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, /* * If a new destination address is specified, scrub the old one and * install the new destination. Note that the interface must be - * p2p or loopback (see the check above.) + * p2p (see the check above.) */ if ((ifp->if_flags & IFF_POINTOPOINT) && dst6.sin6_family == AF_INET6 && !IN6_ARE_ADDR_EQUAL(&dst6.sin6_addr, &ia6->ia_dstaddr.sin6_addr)) { -- 2.20.1