Move mld6 address variables from data to stack memory to make them
authorbluhm <bluhm@openbsd.org>
Mon, 5 Sep 2022 15:47:39 +0000 (15:47 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 5 Sep 2022 15:47:39 +0000 (15:47 +0000)
MP safe.  Due to the KAME scope address hack, the link-local all
nodes and all routers IPv6 addresses cannot be const.
OK benno@

sys/netinet6/mld6.c

index 205d7cc..1550293 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mld6.c,v 1.59 2022/09/04 06:49:11 jsg Exp $   */
+/*     $OpenBSD: mld6.c,v 1.60 2022/09/05 15:47:39 bluhm Exp $ */
 /*     $KAME: mld6.c,v 1.26 2001/02/16 14:50:35 itojun Exp $   */
 
 /*
@@ -85,9 +85,6 @@
 
 static struct ip6_pktopts ip6_opts;
 int    mld6_timers_are_running;        /* [N] shortcut for fast timer */
-/* XXX: These are necessary for KAME's link-local hack */
-static struct in6_addr mld_all_nodes_linklocal = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
-static struct in6_addr mld_all_routers_linklocal = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
 
 void mld6_checktimer(struct ifnet *);
 static void mld6_sendpkt(struct in6_multi *, int, const struct in6_addr *);
@@ -118,6 +115,9 @@ mld6_init(void)
 void
 mld6_start_listening(struct in6_multi *in6m)
 {
+       /* XXX: These are necessary for KAME's link-local hack */
+       struct in6_addr all_nodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
+
        /*
         * RFC2710 page 10:
         * The node never sends a Report or Done for the link-scope all-nodes
@@ -125,9 +125,10 @@ mld6_start_listening(struct in6_multi *in6m)
         * MLD messages are never sent for multicast addresses whose scope is 0
         * (reserved) or 1 (node-local).
         */
-       mld_all_nodes_linklocal.s6_addr16[1] = htons(in6m->in6m_ifidx);/* XXX */
-       if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &mld_all_nodes_linklocal) ||
-           __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) < __IPV6_ADDR_SCOPE_LINKLOCAL) {
+       all_nodes.s6_addr16[1] = htons(in6m->in6m_ifidx);
+       if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &all_nodes) ||
+           __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) <
+           __IPV6_ADDR_SCOPE_LINKLOCAL) {
                in6m->in6m_timer = 0;
                in6m->in6m_state = MLD_OTHERLISTENER;
        } else {
@@ -143,15 +144,19 @@ mld6_start_listening(struct in6_multi *in6m)
 void
 mld6_stop_listening(struct in6_multi *in6m)
 {
-       mld_all_nodes_linklocal.s6_addr16[1] = htons(in6m->in6m_ifidx);/* XXX */
-       mld_all_routers_linklocal.s6_addr16[1] =
-           htons(in6m->in6m_ifidx); /* XXX: necessary when mrouting */
+       /* XXX: These are necessary for KAME's link-local hack */
+       struct in6_addr all_nodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
+       struct in6_addr all_routers = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
+
+       all_nodes.s6_addr16[1] = htons(in6m->in6m_ifidx);
+       /* XXX: necessary when mrouting */
+       all_routers.s6_addr16[1] = htons(in6m->in6m_ifidx);
 
        if (in6m->in6m_state == MLD_IREPORTEDLAST &&
-           (!IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &mld_all_nodes_linklocal)) &&
-           __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) > __IPV6_ADDR_SCOPE_INTFACELOCAL)
-               mld6_sendpkt(in6m, MLD_LISTENER_DONE,
-                   &mld_all_routers_linklocal);
+           (!IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &all_nodes)) &&
+           __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) >
+           __IPV6_ADDR_SCOPE_INTFACELOCAL)
+               mld6_sendpkt(in6m, MLD_LISTENER_DONE, &all_routers);
 }
 
 void
@@ -163,6 +168,8 @@ mld6_input(struct mbuf *m, int off)
        struct in6_multi *in6m;
        struct ifmaddr *ifma;
        int timer;              /* timer value in the MLD query header */
+       /* XXX: These are necessary for KAME's link-local hack */
+       struct in6_addr all_nodes = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
 
        IP6_EXTHDR_GET(mldh, struct mld_hdr *, m, off, sizeof(*mldh));
        if (mldh == NULL) {
@@ -239,15 +246,13 @@ mld6_input(struct mbuf *m, int off)
                timer = ntohs(mldh->mld_maxdelay)*PR_FASTHZ/MLD_TIMER_SCALE;
                if (timer == 0 && mldh->mld_maxdelay)
                        timer = 1;
-               mld_all_nodes_linklocal.s6_addr16[1] =
-                       htons(ifp->if_index); /* XXX */
+               all_nodes.s6_addr16[1] = htons(ifp->if_index);
 
                TAILQ_FOREACH(ifma, &ifp->if_maddrlist, ifma_list) {
                        if (ifma->ifma_addr->sa_family != AF_INET6)
                                continue;
                        in6m = ifmatoin6m(ifma);
-                       if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr,
-                                               &mld_all_nodes_linklocal) ||
+                       if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &all_nodes) ||
                            __IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) <
                            __IPV6_ADDR_SCOPE_LINKLOCAL)
                                continue;