]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: unset ZEBRA_IFA_PEER if no dst addr present (BZ#801)
authorDavid Lamparter <equinox@opensourcerouting.org>
Tue, 1 Jul 2014 14:14:05 +0000 (16:14 +0200)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 18 Aug 2014 16:16:28 +0000 (18:16 +0200)
On OpenBSD, carp interfaces claim to be PtP interfaces with a 0.0.0.0/0
peer address.  We process those in zebra and try to send them to
clients, at which point they get encoded as all-0.  The client code,
however, decodes that to a NULL pointer instead of 0.0.0.0.  This later
turns into a SEGV when CONNECTED_PREFIX sees that ZEBRA_IFA_PEER is set
and tries to access the peer prefix.

This is a band-aid fix for stable/0.99.23, a long-term solution needs
some conceptual improvements on the entire thing.

(The usefulness of a PtP-to-0.0.0.0/0 is a separate question;  at this
point dropping the peer prefix seems the least intrusive solution.)

Reported-by: Laurent Lavaud <laurent.lavaud@ladtech.fr>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
lib/zclient.c

index 20188f6abdb43d1f5b529bf608fcf3619ca431f5..3b5477e9034287a3194c81bb5f46c9c270ee5451 100644 (file)
@@ -805,6 +805,16 @@ zebra_interface_address_read (int type, struct stream *s)
           ifc->flags = ifc_flags;
           if (ifc->destination)
             ifc->destination->prefixlen = ifc->address->prefixlen;
+          else if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER))
+            {
+              /* carp interfaces on OpenBSD with 0.0.0.0/0 as "peer" */
+              char buf[BUFSIZ];
+              prefix2str (ifc->address, buf, sizeof(buf));
+              zlog_warn("warning: interface %s address %s "
+                   "with peer flag set, but no peer address!",
+                   ifp->name, buf);
+              UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
+            }
         }
     }
   else